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

Cyk*_*ker 29 bash ssh

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

Jak*_*uje 30

你有几个可能性:

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

这在很大程度上取决于用例,你会走哪条路。

  • 手动采购`~/.bashrc` 不是必需的,默认情况下会发生。事实上,在我看来这是个坏主意。 (8认同)
  • `$PATH` 不会从 `~/.ssh/environment` 扩展,至少在 `OpenSSH_7.9p1, OpenSSL 1.1.1b 26 Feb 2019` 中不会扩展。 (3认同)
  • 我发现,它没有扩展,因为我在我的“~/.ssh/environment”中添加了一行“PATH=$PATH:/new/path”,而它应该是“PATH=$PATH:/new” /路径` (3认同)
  • 在 MacOS Catalina OpenSSH_8.1p1 上,请警告您最好执行 `$ echo "PATH=$PATH" > ~/.ssh/environment` 因为 `$PATH` 不会扩展 (3认同)
  • @Jaakko它可能在 sshd_config 中使用 `PermitUserEnvironment` 被禁用(最近版本中默认) (2认同)

ImH*_*ere 6

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

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

ssh user@host command
Run Code Online (Sandbox Code Playgroud)

将作为客户端 ssh 执行命令 ssh(仅此而已)。
要做到这一点的地方shell需要启动子壳或一个新的外壳或登录。

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

客户端 ssh 命令打开到远程系统的网络连接,如果正确验证,将启动一个新的shell 来执行作为参数写入 ssh 的命令,或者,如果没有给出参数,则期待进一步的命令在那个连接上。

这个新的远程shell 必然是一个登录 shell,因为远程用户(到那个系统)需要经过身份验证才能登录。或者,如果给出了某些特定命令,只需使用经过身份验证的用户权限运行此类命令。

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

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

然后启动一个 ssh 控制台:

$ ssh sorontar@localhost
/etc/profile was read
/etc/bash.bashrc was read
/home/sorontar/.profile was read
/home/sorontar/.bashrc was read
Run Code Online (Sandbox Code Playgroud)

在这种情况下,两个bashrc文件都被读取,因为每个profile文件都有包含它们的命令,而不是因为登录 shell 直接获取它们。

$ ssh sorontar@localhost :
/etc/bash.bashrc was read
/home/sorontar/.bashrc was read
Run Code Online (Sandbox Code Playgroud)

在本系统中,bashrc两种情况下都会读取where 。

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

改变路径

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

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