我在远程计算机的“.bashrc”文件中声明了一些“PATH”变量。当我登录到远程计算机时,所有这些“PATH”变量都可以正常工作。但是当我执行“ssh user@remote env”时,“.bashrc”中声明的“PATH”不会被读取。我该如何解决这个问题?
这是远程机器主目录中的“.bash_profile”:
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:
export PATH
这是远程机器主目录中的“.bashrc”:
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# PATH
export PATH=$HOME/git-1.8/bin/:$PATH
这是从我的本地机器执行命令“ssh user@remote env”的当前输出:
SHELL=/bin/bash
SSH_CLIENT=NNNNNNNNNNNNNNN
USER=XXXXXXXXX
MAIL=/var/mail/XXXXXXXX
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/openssh/bin
PWD=/volume2/home/hp120242/XXXXXXXXX
SHLVL=1
HOME=/home/hp120242/XXXXXXXXXX
LOGNAME=XXXXXXXXXXXXX
SSH_CONNECTION=NNNNNNNNNNNNNNNNNNN
LC_CTYPE=en_US.UTF-8
_=/bin/env
我没有遥控器的 root 权限。
答案1
在我的盒子上,当使用 ssh 联系盒子获取环境列表时,将内容塞入export HI=THERE
一个原本为空的盒子中,会显示以下输出:~/.bashrc
$ ssh $host /usr/bin/env 2>/dev/null | grep HI
HI=THERE
我~/.bashrc
采取的方法是检查用户特定的环境变量,然后,如果缺少,则执行相当于以下的操作:
. ~/.profile # load in (Bourne-shell syntax) baseline environment variables
因此,我的 ssh 命令 - 即使 bash 启动时就像是一个子 shell(仅限 .bashrc) - 仍然会获取我通常期望的非交互式 shell 的环境变量。我似乎记得多年前曾明确为 SSH 执行过此操作。
您可以~/.profile
设置一些变量,例如ENVGOOD=true
,然后在您的中包含以下内容~/.bashrc
:
[ -z "$ENVGOOD" ] && . ~/.profile # sets ENVGOOD=true
或创建一个~/.ssh/environment
。请注意,后者仅PermitUserEnvironment = true
在/etc/ssh/sshd_config
设置了时才有效,即不是默认值(当然这也是为什么我的设置不依赖它)。
答案2
请参阅这个答案:SSH 不读取 rc 文件
.bash_profile
运行命令时不会执行,因为 SSH 不会执行登录 shell,而是执行命令。您可以尝试设置环境变量,~/.ssh/environment
但可能已禁用对此文件的读取。
您可以尝试通过以下方式强制登录 shell ssh user@host bash -lc env
:。
正如其他人提到的,.bashrc
在运行命令时应该读取。您可以通过echo EXECUTED
在顶部你的.bashrc
。
还有可能的是,无论什么都在/etc/bashrc
调用exit
,因此下面的任何内容都不会运行。
答案3
在 CentOS/RHEL 上,我做了以下操作
ssh user@host "source .bash_profile; env "
不要忘记 \$,以便使用远程环境变量。例如,以下命令将打印相同的值
echo $SSH_CLIENT; ssh user@host "source .bash_profile; echo $SSH_CLIENT "
下面的命令
echo $SSH_CLIENT; ssh user@host "source .bash_profile; echo \$SSH_CLIENT "
将打印出您所期望的内容。
答案4
在远程机器上,验证您的 sshd 进程没有覆盖 PATH 的选项。
ps aux | grep sshd