/etc/profile.d和“ssh -t”

我想在远程机器上运行一个脚本。 简单的解决scheme是这样的:

ssh remote1 some-script 

直到远程脚本不想连接到需要交互式authentication的另一个远程计算机( remote2 ),如tis one(在这种情况下remote2只能通过remote1访问):

 ssh remote1 "ssh remote2 some-script" 

问题的解决scheme是使用-t选项来使用ssh。

 ssh -t remote1 "ssh remote2 some-script" 

这个工作,但我得到探针,以防我使用这个(其中some-script可能会执行更多的SSH命令):

 ssh -t remote1 some-script 

我发现一些环境variables没有被设置,当我不使用-t选项的时候设置。 这些环境variables是从/etc/profile.d脚本中设置的。 我猜这些脚本不是由于某些原因运行,如果使用-t选项,但是如果我不使用它,则运行。

这是什么原因? 有什么办法可以解决它吗? 我正在使用SUSE Linux(版本10)。

编辑:我做了一些额外的研究。 我把一些输出线放到以下地方:

  • /etc/profile.d中的一个文件中
  • ~/.bash_profile (文件之前不存在)
  • ~/.bashrc (文件不存在之前)

然后我检查了几个场景,我得到了什么样的输出结果(我检查的环境variables是$PATH ):

  • ssh remote1profile.d.bashrc.bash_profile$PATH OK。
  • ssh -t remote1profile.d.bashrc.bash_profile$PATH OK。
  • ssh remote1 echo '$PATH' :只有.bashrc$PATH OK。
  • ssh -t remote1 echo '$PATH' :没有脚本输出。 $PATH NOK。

现在我真的不明白发生了什么事情。 如果我运行一个交互式shell,一切似乎都工作正常(虽然我觉得~/.bashrc包含在~/.bash_profile之前是很奇怪的)。 如果我启动一个没有-t的非交互式shell,configuration文件脚本似乎不运行,但设置了环境variables。 如果我用-t启动非交互式shell,那么configuration文件scrtipts不会运行,环境variables也不会被设置。 有没有人有这个解释?

所有问题都在bash手册页的“调用”一节中得到解答:

当bash作为交互式loginshell或者作为具有–login选项的非交互式shell调用时,它首先从文件/ etc / profile中读取并执行命令(如果该文件存在)。 读取该文件后,它将按照该顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从第一个存在并读取的第一个中读取和执行命令。 当shell开始禁止这种行为时,可以使用–noprofile选项。

当loginshell退出时,bash会从〜/ .bash_logout文件中读取和执行命令(如果存在)。

当一个不是loginshell的交互式shell被启动时,如果该文件存在,bash将读取并执行〜/ .bashrc中的命令。 这可以通过使用–norc选项来禁止。 –rcfile文件选项将强制bash从文件读取并执行命令,而不是〜/ .bashrc。

正如你所看到的,交互式shell只有源代码.bashrc ,并且通常.bash_profile将从那里获得,这就解释了你所看到的顺序。

通常情况下,这些文件也只能parsing某些交互式shell的部分( [[ $- == *i* ]] ),这就解释了为什么某些部分对于非交互式shell可能会丢失。

我没有find问题的原因。 也许它是特定于平台(SLES 10或我使用的变体)。 我find了一个解决方法,而不是:

 ssh -t remote1 "/bin/bash --login -c some-script" 

这会强制运行configuration文件脚本的loginshell。