为什么ssh远程命令的$PATH与交互式shell的$PATH不同?

前端之家收集整理的这篇文章主要介绍了为什么ssh远程命令的$PATH与交互式shell的$PATH不同?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个用户没有修改任何点文件中的$PATH:它正是系统默认设置.从登录 shell
$ssh example.com
user@example.com:~$cat /tmp/hello.hs
#!/bin/bash

echo "$SHELL"
echo "$PATH"

user@example.com:~$/tmp/hello.hs
/bin/bash
/usr/local/bin:/usr/bin:/bin

正如/ etc / profile中指定的那样.我觉得这很意外:

$ssh example.com '/tmp/hello.sh'
/bin/bash       
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games

就像我说的那样,〜/ .bashrc中没有修改$PATH,也没有修改/etc/bash.bashrc中的$PATH.没有〜/ .ssh /环境. ssh(1)声明环境变量PATH是

Set to the default PATH,as specified when compiling ssh.

但是来自StackOverflow的this thread和这篇mailing list文章建议我应该能够通过修改/ etc / profile,shell启动文件之一等来影响给定命令的$PATH.

这里发生了什么?

从ssh(1)手册页:“如果指定了命令,它将在远程主机而不是登录shell上执行.”

因此,当您实际登录到计算机时,bash作为登录shell启动并加载适当的文件,当您远程连接并发出命令时,它将在bash的位置运行,这意味着这些文件不会加载.你可以在ssh的命令部分使用su -l -c或类似的方法解决它.

在某些情况下,我也看到了-sh参数ssh work(allocate tty).

编辑1:
我认为您找到的PATH信息,默认路径(除非我们覆盖它)是编译成sshd的路径.我确保我的/ etc / profile,/ etc / bash *,本地dotfiles等没有任何PATH信息,然后我登录并仍然有一个PATH.我在sshd搜索了这个,并在那里找到了它.所以它的手册如何说:

ahnberg@remote$strings /usr/sbin/sshd | grep -i x11 | grep bin
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games

然后我将PATH = $PATH:/ my / test添加到远程我的.bashrc文件的最顶层,然后再次检查:

ahnberg@local$ssh ahnberg@remote "env | grep PATH"
PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/my/test

所以我绝对可以影响它,默认PATH是编译成sshd的那个.

猜你在找的Bash相关文章