Ця відповідь розвивається як із обраної відповіді , додаючи більше безпеки.
Ця відповідь обговорювала загальну форму
<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
Припустимо, що в обліковому записі користувача Bє user-B, а в B є ключ ssh id-clip, створений звичайним способом ( ssh-keygen).
Тоді в user-Assh каталозі є файл
/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