为什么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的检查之上。