更改路径

更改路径

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


编辑。这个问题对于 Bash 来说是微不足道的,因为(正如人们指出的)~/.bashrc 源于这种情况。最终的答案来自以下段落man bash

Bash 尝试确定它何时使用连接到网络连接的标准输入运行,例如何时由远程 shell 守护程序(通常是 rshd)或安全 shell 守护程序 sshd 执行。如果bash确定它正在以这种方式运行,则~/.bashrc如果该文件存在并且可读,它将读取并执行来自 的命令。如果作为 调用,它不会执行此操作sh。该--norc选项可用于禁止此行为,并且该--rcfile选项可用于强制读取另一个文件,但 rshd 和 sshd 通常都不会使用这些选项调用 shell 或允许指定它们。

答案1

你有几种可能性:

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

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

答案2

你等于当地的设置为偏僻的设置。

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

ssh user@host command

将作为客户端 ssh 执行命令 ssh (仅此而已)。
为此,当地的外壳需求不是启动子 shell 或新 shell 或登录。

该命令的执行方式ls为:本地。

这是客户端 ssh 命令,用于打开到某个计算机的网络连接偏僻的系统,如果经过正确的身份验证,新的shell 将启动执行作为 ssh 参数写入的命令,或者,如果未给出参数,则期望在该连接上执行更多命令。

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

$file sourced您可以通过在每个文件的开头添加一个来查看哪些文件来自哪里(在偏僻的system)(需要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

然后启动 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文件都有包含它们的命令,而不是因为登录 shell 直接获取了它们。

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

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

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

更改路径

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

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

答案3

如果您想要一次性行为并且远程主机中的 SHELL 是 bash,您可以直接执行以下操作:

ssh user@host "PATH=/foo/bar command"

如果SHELL不是bash,你可以这样做

ssh user@host "bash -c 'PATH=/foo/bar command'"

答案4

可以在~/.ssh/rc文件中执行命令(并设置 PATH 或其他环境变量)。从人SSH

〜/ .ssh / rc

当用户登录时,就在用户的 shell(或命令)启动之前,此文件中的命令由 ssh 执行。有关详细信息,请参阅 sshd(8) 手册页。

sshd 手册在其完整Login process描述中指定了这一点:

  1. 如果 ~/.ssh/rc 存在,则运行它;否则如果 /etc/ssh/sshrc 存在,则运行它;否则运行 xauth。 “rc”文件在标准输入中被赋予 X11 身份验证协议和 cookie。请参阅下面的 SSHRC。

该文件的主要目的是运行用户主目录可访问之前可能需要的任何初始化例程; AFS 是此类环境的一个特例。

这是来自 2013 年 BSD 手册。从我最新的 2020 年 Arch Linux BSD 手册中,给出了这些详细信息:

  1. 如果 ~/.ssh/rc 存在并且设置了 sshd_config(5) PermitUserRC 选项,则运行它;否则如果 /etc/ssh/sshrc 存在,则运行它;否则运行 xauth。 “rc”文件在标准输入中被赋予 X11 身份验证协议和 cookie。请参阅下面的 SSHRC。

可能是因为这个设置~/.ssh/rc不适合我。

我找不到在哪一步sshd运行用户的登录脚本。也许它是在 ssh 配置脚本中设置的(在这种情况下它是依赖于发行版的)。

相关内容