ssh 忽略配置文件中的变量

ssh 忽略配置文件中的变量

我提前为这个模糊的问题道歉,但我不知道如何缩小这个问题的范围。

我在 Ubuntu 14.04.5 LTS 上使用它OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.10, OpenSSL 1.0.1f 6 Jan 2014作为我的 ssh 客户端。我根据以下说明设置了无密码 ssh:https://help.ubuntu.com/lts/serverguide/openssh-server.html

现在,ssh 可以正常工作,除了我定义的所有变量.bashrc.profile都被忽略了(是的,我知道.profile来源.bashrc)。我在 askubuntu.com 或 stackexchange 等网站上找到的所有与此问题相关的帖子都无法解决此问题。

局部变量在本地和远程机器上都存在,但是当我ssh进入远程机器时,它们不存在,这意味着它们在“ssh ab.cd.efg.hij env”的输出中缺失;同样,ssh ab.cd.efg.hij 'echo $LOCAL_VARIABLE'没有输出。

造成这种行为的原因是什么?

编辑

我没有远程机器上的.bash_profile或,正如steeldriver 所问。我先添加到其中一个,然后又添加到另一个,但它仍然缺少 'ssh ab.cd.efg.hij env' 和。.bash_loginexport LOCAL_VARIABLE=foossh ab.cd.efg.hij 'echo $LOCAL_VARIABLE'

答案1

Bash.profile在作为交互式登录 shell 运行时会读取 *。当给出命令执行时,或者当运行脚本时,除非您给出选项,否则它是非交互式的;-i除非您给出选项,否则它是非登录的-l。通过 SSH 执行命令时,通常不可能出现上述两种情况。

当通过 SSH 非交互方式运行时, Bash 确实会读取.bashrc。但是,默认.bashrc包括对交互使用的检查:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

因此实际上,当您执行 时,没有在.profile或中设置的变量.bashrc可用。您可以在检查交互式执行之前ssh foo some-command放入变量。例如:.bashrc

$ head ~/.bashrc
echo foo
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
$ ssh localhost env
foo
LC_MEASUREMENT=en_GB.UTF-8
SSH_CONNECTION=127.0.0.1 46916 127.0.0.1 22
LC_PAPER=en_GB.UTF-8
LC_MONETARY=en_GB.UTF-8
LANG=en_GB.UTF-8
LC_NAME=en_GB.UTF-8
XDG_SESSION_ID=155
USER=muru
...

执行echo foo了。如果我有export foo=bar,那么foo就会出现在env输出中。

.bash_profile* 对诸如等文件的存在提出适当的警告。

相关内容