Этот ответ развивается как на выбранный ответ , добавляя больше безопасности.
Этот ответ обсуждался в общем виде
<command that makes output> | \
ssh <user A>@<host A> <command that maps stdin to clipboard>
Там , где безопасность может отсутствовать в то sshразрешение позволяет <user B>на host B>к sshв host Aи выполнить любую команду.
Конечно , Bдля Aдоступа может быть уже закрытого типа с помощью sshключа, и он может даже иметь пароль. Но другой уровень безопасности может ограничивать область допустимых команд, которые Bмогут выполняться A, например, которые rm -rf /не могут быть вызваны. (Это особенно важно, когда sshключ не имеет пароля.)
К счастью, sshимеет встроенную функцию, называемую ограничением команд или принудительной командой . Смотрите ssh.com , или этот вопрос serverfault.com .
Приведенное ниже решение показывает решение в общей форме вместе с принудительным ssh ограничением команд .
Пример решения с добавленным ограничением команд
Это улучшенное решение безопасности следует общей форме - вызов из sshсеанса host-Bпросто:
cat <file> | ssh <user-A>@<host A> to_clipboard
Остальная часть этого показывает установку, чтобы заставить это работать.
Настройка ограничения команды ssh
Предположим, что учетная запись пользователя Bis user-B, а B имеет ключ ssh id-clip, который был создан обычным способом ( ssh-keygen).
Тогда в user-A'ssh каталоге есть файл
/home/user-A/.ssh/authorized_keys
который распознает ключ id-clipи позволяет sshсоединение.
Обычно содержимым каждой строки authorized_keysявляется именно тот открытый ключ, который авторизуется, например, содержимое id-clip.pub.
Однако для принудительного ограничения команды необходимо, чтобы содержимое открытого ключа предшествовало (в той же строке) команде, которая должна быть выполнена.
В нашем случае:
command="/home/user-A/.ssh/allowed-commands.sh id-clip",no-agent-forwarding,no-port-forwarding,no-user-rc,no-x11-forwarding,no-pty <content of file id-clip.pub>
Назначенная команда "/home/user-A/.ssh/allowed-commands.sh id-clip"и только эта назначенная команда выполняется всякий раз, когда id-clipиспользуется ключ, инициироватьssh соединение сhost-A - независимо от того, какая команда записана в sshкомандной строке .
Команда указывает файл скрипта allowed-commands.sh , и содержимое этого файла сценария
#/bin/bash
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.
Id=${1}
case "$SSH_ORIGINAL_COMMAND" in
"to-clipboard")
notify-send "ssh to-clipboard, from ${Id}"
cat | xsel --display :0 -i -b
;;
*)
echo "Access denied"
exit 1
;;
esac
Оригинальный звонок ssh на машину Bбыл
... | ssh <user-A>@<host A> to_clipboard
Строка to-clipboardпередается allowed-commands.shпеременной окруженияSSH_ORIGINAL_COMMAND . Кроме того, мы передали имя ключа id-clip, из строки, в authorized_keysкоторой доступен только id-clip.
Линия
notify-send "ssh to-clipboard, from ${Id}"
это просто всплывающее окно с сообщением о том, что буфер обмена пишется - это, вероятно, также хорошая функция безопасности. ( notify-sendработает на Ubuntu 18.04, возможно, не на других).
В линии
cat | xsel --display :0 -i -b
параметр --display :0необходим, потому что у процесса нет собственного X-дисплея с буфером обмена, поэтому он должен быть явно указан. Это значение :0работает в Ubuntu 18.04 с сервером окон Wayland. На других установках это может не сработать. Для стандартного X-сервера этот ответ может помочь.
host-A /etc/ssh/sshd_config параметры
Наконец, несколько параметров /etc/ssh/sshd_configна хосте, Aкоторые должны быть установлены, чтобы обеспечить разрешение на подключение и разрешение использовать ssh-key только без пароля:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A
Чтобы sshdсервер перечитал конфиг
sudo systemctl restart sshd.service
или
sudo service sshd.service restart
вывод
Это to-clipboardтребует определенных усилий, но другие функции помимо этого могут быть построены параллельно в той же самой структуре.
:'<,'>w !ssh desktop pbcopy