这个答案在chosen answer 的基础上增加了更多的安全性。
那个答案讨论了一般形式
<command that makes output> | \
ssh <user A>@<host A> <command that maps stdin to clipboard>
可能缺乏安全性的地方是ssh 权限允许host B> 上的<user B> 到ssh 进入host A 并执行any 命令。
当然,B 到 A 的访问可能已经被 ssh 密钥所限制,甚至可能有密码。但是另一层安全性可以限制B 可以在A 上执行的允许命令的范围,例如这样rm -rf / 就不能被调用。 (当ssh 键没有有密码时,这一点尤其重要。)
幸运的是,ssh 有一个称为命令限制或强制命令的内置功能。请参阅ssh.com,或
这个serverfault.com question。
下面的解决方案显示了通用表单解决方案以及强制执行的ssh 命令限制。
添加了命令限制的示例解决方案
此安全增强解决方案遵循一般形式 - 来自 host-B 上的 ssh 会话的调用很简单:
cat <file> | ssh <user-A>@<host A> to_clipboard
剩下的部分显示了让它工作的设置。
ssh命令限制设置
假设B 上的用户帐户是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 启动与host-A 的ssh 连接时执行 - 不管是什么命令写在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
在机器 B 上对 ssh 的原始调用是
... | ssh <user-A>@<host A> to_clipboard
字符串to-clipboard由环境变量SSH_ORIGINAL_COMMAND传递给allowed-commands.sh。
此外,我们从authorized_keys 的行中传递了密钥的名称id-clip,只有id-clip 才能访问。
线
notify-send "ssh to-clipboard, from ${Id}"
只是一个弹出消息框,让您知道正在编写剪贴板 - 这可能也是一个很好的安全功能。 (notify-send 适用于 Ubuntu 18.04,可能不适用于其他版本)。
在一行
cat | xsel --display :0 -i -b
参数--display :0 是必需的,因为该进程没有自己的带有剪贴板的X 显示,
所以必须明确说明。这个值 :0 恰好在带有 Wayland 窗口服务器的 Ubuntu 18.04 上工作。在其他设置上它可能不起作用。对于标准 X 服务器this answer 可能会有所帮助。
host-A/etc/ssh/sshd_config参数
最后应该设置主机A上的/etc/ssh/sshd_config中的几个参数,以确保允许连接,并允许使用ssh-key,无需密码:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A
让sshd服务器重新读取配置
sudo systemctl restart sshd.service
或
sudo service sshd.service restart
结论
设置起来有点费力,但是除了to-clipboard之外的其他功能可以在同一个框架中并行构建。