这个答案在选择的答案基础上发展,增加了更多的安全性。
那个回答讨论了一般形式
<command that makes output> | \
ssh <user A>@<host A> <command that maps stdin to clipboard>
可能缺乏安全性的地方是允许主机B>上<用户B> ssh到主机A并执行任何命令的ssh权限。
当然,从B到A的访问可能已经由ssh密钥进行了门控,它甚至可能有一个密码。但是另一个安全层可以限制B可以对A执行的允许命令的范围,例如,rm -rf /不能被调用。(当ssh密钥没有密码时,这一点尤其重要。)
幸运的是,ssh有一个称为命令限制或强制命令的内置功能。参见ssh.com,或者
这个serverfault.com问题。
下面的解决方案显示了一般的表单解决方案以及强制执行的ssh命令限制。
增加命令限制的解决方案
这个安全增强的解决方案遵循一般形式-从主机- b上的ssh会话调用简单:
cat <file> | ssh <user-A>@<host A> to_clipboard
剩下的部分显示了使其工作的设置。
ssh命令限制设置
假设B上的用户帐户是user-B, B有一个ssh密钥id-clip,它是以通常的方式创建的(ssh-keygen)。
然后在用户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”,并且只有指定的命令会在key id-clip被使用时执行到host-A的ssh连接-无论ssh命令行中写了什么命令。
该命令指示允许的脚本文件-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
clipboard的字符串通过环境变量SSH_ORIGINAL_COMMAND传递给allowed-commands.sh。
另外,我们已经从authorized_keys中传递了密钥的名称id-clip,它只能被id-clip访问。
这条线
notify-send "ssh to-clipboard, from ${Id}"
只是一个弹出的消息框,让你知道剪贴板正在写入-这可能是一个很好的安全功能。(通知发送在Ubuntu 18.04上有效,其他系统可能不行)。
在队列中
cat | xsel --display :0 -i -b
参数——display:0是必要的,因为进程没有自己的X显示和剪贴板,
所以必须明确指定。这个值:0恰好在Ubuntu 18.04和Wayland窗口服务器上工作。在其他设置中,它可能不起作用。对于标准的X服务器,这个答案可能会有所帮助。
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
or
sudo service sshd.service restart
结论
这是一些努力建立,但其他功能除了to-剪贴板可以在相同的框架并行构建。