SSH远程命令不读取所有环境变量

SSH远程命令不读取所有环境变量

我在远程计算机的“.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

相关内容