运行ssh命令时如何设置PATH?


18

假设用户具有/bin/bash作为shell的权限/etc/passwd。然后ssh user@host command使用Bash运行命令。但是,该外壳既不是登录名也不是交互式的,这意味着也~/.bash_profile没有~/.bashrc来源。在那种情况下,如何设置PATH环境变量,以便可以找到并执行可执行文件?是否建议在实际命令前加上前缀source ~/.bashrc


5
.bashrc来源,但顶部可能会进行交互性测试。您在该检查之前输入的内容应该适用,这就是我在服务器不允许用户环境或使用时强制执行PATH的操作~/.pam_environment
muru

Answers:


18

您几乎没有什么可能:

  • PATH在服务器上将设置为~/.ssh/environment(需要通过PermitUserEnvironment yesin 启用sshd_config)。
  • 使用二进制的完整路径
  • 就像您提到的那样,手动source .bashrc:在命令前加上. ~/.bashrc(或source

这在很大程度上取决于用例,您将采用哪种方式。


6
手动采购~/.bashrc不是必需的,默认情况下会发生。事实上,在我看来,这是个坏主意。
sorontar '16

$PATH不会从扩展~/.ssh/environment,至少不会在扩展OpenSSH_7.9p1, OpenSSL 1.1.1b 26 Feb 2019
Jaakko,

1
@Jaakko可能已在sshd_config中使用禁用了它PermitUserEnvironment(最新版本中为默认设置)
Jakuje

我想它了,它没有扩大,因为我添加了一行PATH="$PATH:/new/path"到我~/.ssh/environment时,它应该是PATH=$PATH:/new/path
亚科

4

您将本地设置等同于远程设置。

在本地,一个bash实例,您正在其中编写的当前正在运行的shell:

ssh user@host command

将作为客户端ssh执行命令ssh(仅此而已)。
为此,本地外壳无需启动子外壳或新外壳或登录。

该命令作为以下ls命令执行:在本地。

客户端ssh命令打开了到远程系统的网络连接,在该系统中,如果正确通过身份验证,将启动新的 Shell以执行作为ssh的参数写的命令,或者,如果未给出参数,则需要其他命令在那个连接上。

由于需要验证远程用户(该系统的用户)才能登录,所以新的Remote Shell必然是登录Shell。或者,如果给出了一些特定的命令,则只需以经过身份验证的用户权限运行该命令。

您可以通过$file sourced在每个文件的开头(在远程系统中)添加a 来查看源文件(更改/etc/文件需要root ):

$ a=(~/.bashrc ~/.profile /etc/bash.bashrc /etc/profile)
$ for f in "${a[@]}"; do sed -i '1 i\echo "'"$f"' was read"\n' "$f"; done

然后只需启动一个ssh控制台即可:

$ ssh sorontar@localhost
/etc/profile was read
/etc/bash.bashrc was read
/home/sorontar/.profile was read
/home/sorontar/.bashrc was read

在这种情况下,bashrc读取这两个文件是因为每个profile文件都有包含它们的命令,而不是因为登录外壳程序直接将它们作为源。

$ ssh sorontar@localhost :
/etc/bash.bashrc was read
/home/sorontar/.bashrc was read

在此系统中,bashrc两种情况下都在哪里读取。

无需source ~/.bashrc在命令中添加a 即可执行。

变更路径

您需要做的就是/etc/bash.bashrc为在该系统中启动Shell的所有用户添加更改“ $ PATH”的正确设置。或~/.bashrc针对每个需要它的用户。您可以添加(或编辑)用户的骨架,.bashrc/etc/skel/使创建的任何新用户都具有正确的文件。

以上仅对bash有效。如果需要使该设置适用于所有shell,则可以使用ssh文件~/.ssh/environment为每个需要它的用户设置环境变量PATH 。或/etc/ssh/sshrc用于运行ssh服务器的系统中的全局设置(请阅读中的“文件”部分以man sshd获取其他详细信息)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.