perl:通过SSH运行远程perl脚本,并在远程机器上查询环境变量



可能重复:
为什么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'

最新更新