为什么SSH远程命令在手动运行时会获得较less的环境variables?

我有一个命令运行良好,如果我ssh到一台机器,并运行它,但失败时,我试图运行它使用远程SSH命令,如:

ssh user@IP <command> 

使用两种方法比较“env”的输出结果在不同的环境中。 当我手动login到机器并运行env时,我得到更多的环境variables,然后当我运行:

 ssh user@IP "env" 

任何想法为什么?

有不同types的炮弹。 SSH命令执行shell是非交互式shell,而普通shell是loginshell或交互式shell。 从男人的描述如下:

       loginshell是第一个参数的字符
       零是 - ,或者用--login选项开始。

       一个交互式shell是没有非选项启动的
       参数,没有标准input的-c选项
       和错误都连接到terminal(如所确定的
       通过isatty(3)),或者以-i选项开始。  PS1是
       设置和$  - 包括如果bash是交互式的,允许a
        shell脚本或启动文件来testing这个状态。

       以下段落描述了bash如何执行它
       启动文件。 如果有任何文件存在,但不能
       阅读,bash报告错误。 在文件中扩展Tildes
       名称,如下面的Tilde Expansion中所述
       扩展部分。

       当bash被调用为交互式loginshell或者
       带有--login选项的非交互式shell,它首先
       读取并执行文件/ etc / profile中的命令
       该文件存在。 读完这个文件后,它会查找
        〜/ .bash_profile,〜/ .bash_login和〜/ .profile
       顺序,并从第一个读取和执行命令
       存在并且可读。  --noprofile选项可能
       当壳开始禁止这种行为时使用
        IOR。

       当loginshell退出时,bash将读取并执行命令
       从文件〜/ .bash_logout中,如果存在的话。

       当不是loginshell的交互式shell是
       开始,bash从〜/ .bashrc中读取和执行命令,
       如果该文件存在。 这可能会被禁止使用
        --norc选项。  --rcfile文件选项将强制bash
       从文件而不是从文件读取和执行命令
       在〜/ .bashrc。

       当bash以非交互方式启动时,运行一个shell
       脚本,例如,它查找variablesBASH_ENV in
       环境,如果在那里出现,它的价值就会扩大,
       并使用扩展值作为要读取的文件的名称
       并执行。  Bash的行为就像下面的命令一样
       被执行:
              如果[-n“$ BASH_ENV”]; 然后 。  “$ BASH_ENV”; 科幻
       但PATHvariables的值不用于search
       为文件名。

运行命令之前如何获取configuration文件?

ssh user@host "source /etc/profile; /path/script.sh"

您可能会发现最好将其更改为~/.bash_profile~/.bashrc或其他。

(如这里(linuxquestions.org) )

运行远程ssh命令时,Shell环境不加载。 你可以编辑ssh环境文件:

 vi ~/.ssh/environment 

其格式是:

 VAR1=VALUE1 VAR2=VALUE2 

另外,请检查sshdconfigurationPermitUserEnvironment = yes选项。

我有类似的问题,但最终我发现〜/ .bashrc是我所需要的。

但是,在Ubuntu中,我不得不评论停止处理的行〜/ .bashrc:

 #If not running interactively, don't do anything [ -z "$PS1" ] && return 

我发现这个问题的一个简单的解决方法是将源/ etc / profile添加到我试图在目标系统上运行的script.sh文件的顶部。 在这里的系统上,这导致script.sh所需的环境variables被configuration为像从loginshell运行一样。

在之前的回复之一中,有人build议使用〜/ .bashr_profile等等。 我没有花费太多的时间在这个上,但是,这个问题是,如果你SSH上的目标系统上的一个不同的用户login的源系统上的shell看起来这样会导致源系统用户名称被用于〜。

只需要在〜/ .bashrc中导出你想要的环境variables在一个非交互式shell的检查之上。