我有一个用户没有修改任何点文件中的$ PATH:这正是系统的默认设置。 从loginshell:
$ ssh example.com [email protected]:~$ cat /tmp/hello.hs #!/bin/bash echo "$SHELL" echo "$PATH" [email protected]:~$ /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
和/etc/bash.bashrc
没有修改$ PATH。 没有~/.ssh/environment
。 ssh(1)
声明环境variablesPATH
是
设置为编译ssh时指定的默认PATH。
但是这个来自StackOverflow的线程和这个邮件列表文章build议我应该能够通过修改/ etc / profile,shell启动文件之一等来影响给定命令的$ PATH。
这里发生了什么?
从ssh(1)
手册页: “如果指定了命令,它在远程主机而不是loginshell执行”。
所以简而言之,当你实际login到机器时,bash以loginshell的forms启动并加载适当的文件,当你远程连接并发出一个命令时,它会在bash的地方运行,这意味着这些文件不会被加载。 你可以在ssh的命令部分使用su -l -c
或类似命令来解决这个问题。
在某些情况下,我也看到了ssh工作(分配tty)的参数。
编辑1 :
我想你find的PATH信息,默认path(除非我们重写)是编译成sshd的。 我确定我的/ etc / profile,/ etc / bash *,local dotfiles等没有任何PATH信息,然后我login了,仍然有一个PATH。 我用sshdsearch了这个,发现它在那里。 所以它的手册如何说:
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的。 🙂
我能得到ssh运行使用远程path的命令:
ssh dist@d6 "bash --login -c 'env'"
这里env可以用你想要的任何命令取代。
我有授权的密钥,所以不需要密码来运行命令或SSH。
我想出了一个不同的解决scheme来解决这个问题。 我的个人偏好是创build新的configuration文件,而不是改变现有的configuration文件。 这样我可以更容易地从默认configuration中找出变化。
这里是/etc/profile.d/ssh_login.sh
的内容:
#!/bin/sh if [ "$SSH_CONNECTION" ]; then echo "User '$USER' logged in from '${SSH_CONNECTION%% *}'" . /etc/environment fi
使用dropbear
代替openssh-server
(这应该也适用于openssh),当我远程login时,会自动设置SSH_CONNECTIONvariables。 我创build了一个新的shellconfiguration文件configuration来检测SSHlogin,在屏幕上显示一些信息,最重要的是,从/etc/environment
加载全局环境设置来replace编译的值。 请注意,这只会影响交互式SSH shell,而不会影响远程命令的执行。
另外 ,如果你使用openssh并且总是要加载全局环境,不pipe它是否是一个交互式shell,你可以在~/.ssh/
像这样放置一个符号链接:
ln -s /etc/environment ~/.ssh/environment
然后,您需要在/etc/sshd/sshd_config
启用PermitUserEnvironment
选项。 但是,只能为受信任的用户执行此操作,因为这可以使他们能够使用诸如LD_PRELOAD之类的机制绕过某些configuration中的访问限制。 请参阅man sshd_config
了解更多信息,具体如何使用Match
块来限制特定用户/组的选项。
如果您想要加载configuration文件path,请尝试:
#!/bin/bash -i
在脚本的顶部。 这样,运行脚本时shell就处于交互模式。
当bash作为交互式loginshell或者作为具有–login选项的非交互式shell调用时,它首先从文件/ etc / profile中读取并执行命令(如果该文件存在)。 读取该文件后,它将按照该顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从第一个存在并读取的第一个中读取和执行命令。 当shell开始禁止这种行为时,可以使用–noprofile选项。