可能重复:
为什么SSH远程命令获得的环境变量比手动运行时更少?
在Mac OS X 10.8.2上运行
我通过SSH运行一个perl脚本,在perl脚本中,我使用$ENV{MY_VAR_NAME},并且在本地运行时运行良好。但是通过SSH,所有的环境变量都将不设置。
我还试着运行
system("source ~/.bash_profile");
在我的剧本开始时没有用。
有什么建议吗?
编辑:
重新表述我的问题。
我有机器A和B。我在机器B上运行了perl,试图在B上获取环境变量,结果成功了。然后我从A ssh到B运行相同的脚本,即使用以下代码
ssh user@B perl myscript.pl
这一次,B上的环境变量全部为空。
有什么建议吗?
更新:
我发现在运行上面的脚本时,机器B上的~/.bashrc被调用了,但在~/.bahrc中设置了环境变量后,再次运行上面的命令,仍然没有看到任何环境变量。
此外,如果我的perl脚本只包含
echo $ENV{PATH}
然后我得到
/usr/bin:/bin:/usr/sbin:/sbin
使用ssh执行命令时将设置的环境变量取决于:
- 登录shell
- 该shell的启动文件的内容
例如,当bash
启动时,它可以读取以下任何文件:
~/.bash_profile
~/.profile
~/.bashrc
~/.bash_login
/etc/profile
取决于诸如shell是否被视为"登录"shell、会话是否为"交互式"会话等因素。
当您使用ssh
时,您应该了解哪些启动文件正在执行。
您只需将echo here in XXXX
放在各种文件中,然后执行ssh命令就可以实现这一点。(注意,没有命令的ssh
可能会调用与有命令的ssh
不同的启动文件。)
对于bash
,请参阅其man
页面中的INVOCATION
部分,了解bash
启动时读取哪些文件的说明。
诀窍是在同一个远程shell会话下运行.bash_profile
和perl脚本:
ssh user@B 'source ~/.bash_profile && perl myscript.pl'