Edit:在编辑/etc/ssh/sshd_config后重新启动ssh的提示解决了我的问题(Ubuntu上的sudo systemctl restart ssh.service
),但请参阅接受的答案以获得更多有用的故障排除
原始:
我有一个服务器,我连接到一个跳转主机:
export MY_ENV=myvalue
ssh -o StrictHostKeyChecking=yes -o SendEnv=MY_ENV -J <myuser@jumpHostIp> <myuser@hostIp>
跳转主机和主机在/etc/ssh/sshd_config中都有:
AcceptEnv MY_ENV
跳转主机和主机在它们的/home/myuser/中都有。Ssh/authorized_keys限制myuser使用部署脚本的Ssh密钥:
command=/home/myuser/deploy.sh ...rest of public key...
在这个deploy.sh中我想使用$MY_ENV,但是它不起作用。
使用跳跃主机是否以某种方式降低了SendEnv传输的MY_ENV的值?如果是,这是有意的,或者我如何访问主机上的deploy.sh中的MY_ENV的值?
编辑:我精炼了我们在迭代过程中所考虑的细节,为了更好地通用,部分地命名了问题中已经命名的一些细节。
ssh的手册页显示:
请注意,命令行提供的配置指令通常适用于目标主机,而不是任何指定的跳转主机。使用~/。Ssh/config指定跳转主机的配置。
因此您的最终目的地将收到-o
添加的选项。由于跳转主机不涉及这些选项,因此没有必要配置跳转主机以将变量传递到目标主机。
目标服务器上的sshd配置
作为先决条件,目的地-host的sshd服务必须配置为接受环境变量。允许使用通配符:
File:/etc/ssh/sshd_config
AcceptEnv MY_*
更改sshd_config
后,sshd必须重新启动以读取更新的配置
(这个问题的解决方案…)
systemctl restart sshd
重新启动sshd(至少使用"openssh-server">
)时,当前连接将持续存在。authorized_keys
为了限制目标系统上的密钥使用,可以在授权中添加一个选项。
文件:authorized_keys
限制为命令
当省略包含command
选项值的"
引号时,整个PublicKey-Authentication将失败:
command=/home/user/deploy.sh ssh-rsa AAAAB3NzaC1yc2EAA...
# DEBUG response of sshd:
debug1: /home/user/.ssh/authorized_keys:1: bad key options: missing start quote
根据sshd_config
中的设置返回到基于密码的身份验证,Permission denied (publickey).
将分别遵循。
"
引号是必需的,即使命令中没有空格:
command="/home/user/deploy.sh" ssh-rsa AAAAB3NzaC1yc2EAA...
客户端命令的详细信息
注意:除了命令行选项之外,这些细节可以在客户端用户的~/.ssh/config
中配置。
要在命令行中将所需的变量作为选项传递,可以使用以下两种语法:
-o SendEnv=MY_ENV
-o "SendEnv MY_ENV"
请不要忘记"
引号
对变量的可用性至关重要的不仅是设置它,还必须导出它:
这将失败:
MY_ENV="Value"
echo $MY_ENV
Value
…尽管变量显示在当前shell中。
要求:
export MY_ENV="Value"