我正在远程计算机上使用 -t 标志执行命令(以防止命令“阻止”)提示(不知何故它是这样工作的)。所以我正在使用,ssh -nq -t root@ip
但是这样,脚本找不到我使用的环境变量。
为什么会发生这种情况以及如何避免这种情况?
答案1
编辑
ssh
如果您进入计算机然后运行启动登录 shell 的命令,则以下信息有效:
ssh root@ip
echo $XXXX_LICENSE_FILE
如果您尝试直接从ssh
命令 ( ssh root@ip echo $XXXX_LICENSE_FILE
) 访问变量,那么您正在启动一个非登录、非交互shell 在这种情况下既不读取~/.bash_profile
也不~/.bashrc
读取。从bash
手册页:
When bash is started non-interactively, to run a shell script,
for example, it looks for the variable BASH_ENV in the envi‐
ronment, expands its value if it appears there, and uses the
expanded value as the name of a file to read and execute.
Bash behaves as if the following command were executed:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
but the value of the PATH variable is not used to search for
the file name.
最简单的解决方法是简单地与ssh
命令一起声明变量。为此,您需要将此行添加到远程/etc/ssh/sshd_config
文件中:
PermitUserEnvironment yes
然后从本地计算机运行:
XXXX_LICENSE_FILE=/etc/xxxx.lic && ssh -nq -t -t -t root@$ip /etc/init.d/xxxx.rc start
这里的问题是登录 shell 和交互式 shell 之间的区别。看这里一个很好的总结。
~/.bashrc
仅在启动时读取交互的(非登录)外壳。当您ssh
进入远程计算机时,您正在运行登录shell so~/.bash_profile
或~/.bash_login
or ~/.profile
(按该顺序)被读取。您可以通过bash
登录到远程服务器后运行来检查这一点,这将启动一个交互式 shell,~/.bashrc
将被读取并设置您的环境变量。
要解决此问题,请在您的~/.bash_profile
而不是~/.bashrc
.
我假设您正在远程设置变量.bashrc
,而不是本地变量。如果您想导出一个当地的变量结束ssh
,看看关联由 Frederik Deweerdt 发布。最简单的方法是将变量包含在调用中ssh
:
ssh -nq -t root@ip "FOO=foo BAR=bar"