我提前为这个模糊的问题道歉,但我不知道如何缩小这个问题的范围。
我在 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_login
export LOCAL_VARIABLE=foo
ssh 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
* 对诸如等文件的存在提出适当的警告。