![在 ssh 中使用 authorized_keys 命令会破坏 scp](https://linux22.com/image/579992/%E5%9C%A8%20ssh%20%E4%B8%AD%E4%BD%BF%E7%94%A8%20authorized_keys%20%E5%91%BD%E4%BB%A4%E4%BC%9A%E7%A0%B4%E5%9D%8F%20scp.png)
我想使用每个键的命令授权密钥设置一些环境变量。
command="MYVAR=test $SHELL" ssh-rsa mykey
Shell 工作正常,但 scp 不工作。
设置每个密钥的环境变量且不中断 ssh 文件传输的正确方法是什么?
答案1
您的配置强制 ssh 在您使用匹配的私钥连接时运行其中的任何命令$SHELL
。如果您想要的是交互式 shell,那么这没问题,但会破坏直接运行命令的任何尝试。如您所见,这会破坏 `scp,但也会破坏以下内容:
ssh myhost uptime
解决方案是(a)在其他地方设置环境变量(.ssh/rc
或仅使用标准 shell 初始化文件),或(b)当您想要通过文件强制执行命令时使用专用键authorized_keys
。
答案2
所以我意识到这个问题现在已经过时了,但我今天找到了答案。这是设置环境变量的替代方法,根据您的情况,这可能是更好的解决方案。我的情况是这样的:
我有一个 Splunk 实例,它启动到远程主机的 SCP 和 SSH 会话。通过 SCP 发送电子邮件列表,然后使用 SSH 在远程系统上运行脚本以对该电子邮件列表采取行动。这是我的 authorized_keys 文件的顶部:
command="/home/username/wrapper.sh",no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3 etc...
这是我的wrapper.sh脚本:
#!/bin/bash
vars=( $SSH_ORIGINAL_COMMAND )
case "${vars[0]}" in
"/home/username/scripts/myscript.py")
/home/username/scripts/myscript.py ${vars[1]}
exit 0
;;
"scp")
scp -t ${vars[2]}
chmod 644 ${vars[2]}
exit 0
;;
*)
exit 1
;;
esac
第一种情况允许 /home/username/scripts/myscript.py 使用传递给它的任何命令行参数。第二种情况,scp 情况条目,允许将传入文件写入磁盘的预期位置。
此方法允许我将公钥的使用限制为 1 个命令,同时仍允许 scp。如果有人有更好的选择,请分享。:)