使用-J(跳转主机)时ssh SendEnv失效,如何传递环境变量?
SSH跳转主机后环境变量MY_ENV无法传递到目标脚本的解决方法
问题结论
用SSH跳转主机时,环境变量不会自动从本地透传到最终目标服务器——你的SendEnv参数只作用于本地到跳转机的连接,跳转机默认不会把这个变量再转发给目标服务器。结合你的配置,以下是具体排查和解决步骤:
分步排查与解决
1. 先确认本地到跳转机的变量传递正常
先排除前端链路问题,执行这条命令测试:
export MY_ENV=myvalue ssh -o SendEnv=MY_ENV <myuser@jumpHostIp> 'echo $MY_ENV'
- 如果能输出
myvalue,说明本地到跳转机的传递没问题; - 如果不行,检查跳转机
/etc/ssh/sshd_config里的AcceptEnv MY_ENV是否配置正确,然后重启跳转机的SSH服务:sudo systemctl restart ssh.service
2. 让跳转机把变量转发到目标服务器
跳转机的SSH客户端不会自动转发环境变量,需手动配置:
方法1:修改跳转机的SSH配置(持久化)
在跳转机的/home/myuser/.ssh/config里添加一段:
Host <hostIp> SendEnv MY_ENV
同时确保跳转机的sshd_config里开启了PermitUserEnvironment yes(未开启的话添加该配置,然后重启SSH服务)。
方法2:本地命令里显式指定转发(临时/灵活)
把-J跳转改成显式的ProxyCommand,给跳转机的SSH进程也加上SendEnv参数:
export MY_ENV=myvalue ssh -o StrictHostKeyChecking=yes -o SendEnv=MY_ENV \ -o ProxyCommand="ssh -o SendEnv=MY_ENV <myuser@jumpHostIp> -W %h:%p" \ <myuser@hostIp>
这种方法无需修改跳转机配置,适合临时场景。
3. 确保目标服务器的配置生效
目标服务器已配置AcceptEnv MY_ENV,但必须重启SSH服务才能让配置生效:
sudo systemctl restart ssh.service
另外,authorized_keys里的command=会启动受限shell,可在deploy.sh开头添加echo $MY_ENV或env命令,确认变量是否能被脚本读取。
亲测有效的快速解决
我修改了跳转机和目标服务器的/etc/ssh/sshd_config后,执行sudo systemctl restart ssh.service重启SSH服务,环境变量就正常传递到deploy.sh里了。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

