假设用户/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)。.bashrc: 在命令前加上. ~/.bashrc(或source)这在很大程度上取决于用例,你会走哪条路。
您将本地设置等同于远程设置。
在本地,一个 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获取更多详细信息)。