为什么 ssh -nq -t 看不到我的环境变量?

为什么 ssh -nq -t 看不到我的环境变量?

我正在远程计算机上使用 -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_loginor ~/.profile(按该顺序)被读取。您可以通过bash登录到远程服务器后运行来检查这一点,这将启动一个交互式 shell,~/.bashrc将被读取并设置您的环境变量。

要解决此问题,请在您的~/.bash_profile而不是~/.bashrc.


我假设您正在远程设置变量.bashrc,而不是本地变量。如果您想导出一个当地的变量结束ssh,看看关联由 Frederik Deweerdt 发布。最简单的方法是将变量包含在调用中ssh

ssh -nq -t root@ip "FOO=foo BAR=bar"

相关内容