在远程机器上通过 `ssh` 执行命令时未加载环境变量
Environment variables not loaded when executing command via `ssh` on remote machine
我想编写一个脚本,在远程服务器上执行多个命令,其中包括执行一些应用程序。远程机器上的 .bashrc
文件定义了 PATH
变量,因此这些应用程序都在它下面。
但是当我尝试使用 ssh <host> <command>
时,似乎没有加载 .bashrc
。 ssh <host> 'echo $PATH'
只显示一些路径,例如 /usr/bin
.
更让我困惑的是,连ssh <host> "source ~/.bashrc; <command>"
都不行。 ssh <host> 'source ~/.bashrc; echo $PATH'
仍然只打印了几个路径。我通过 ssh <host> 'cat ~/.bashrc'
检查并确认该文件确实包含所有 PATH
定义,这在命令执行的环境中没有受到影响。
于是经过两个小时的排查,终于找到了问题所在。这是因为下面的命令在 .bashrc
.
开头
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
这可以防止在 ssh <host> <command>
的环境中执行之后的任何操作。
如果您遇到类似问题,请尝试检查 .bashrc
文件的开头。
我想编写一个脚本,在远程服务器上执行多个命令,其中包括执行一些应用程序。远程机器上的 .bashrc
文件定义了 PATH
变量,因此这些应用程序都在它下面。
但是当我尝试使用 ssh <host> <command>
时,似乎没有加载 .bashrc
。 ssh <host> 'echo $PATH'
只显示一些路径,例如 /usr/bin
.
更让我困惑的是,连ssh <host> "source ~/.bashrc; <command>"
都不行。 ssh <host> 'source ~/.bashrc; echo $PATH'
仍然只打印了几个路径。我通过 ssh <host> 'cat ~/.bashrc'
检查并确认该文件确实包含所有 PATH
定义,这在命令执行的环境中没有受到影响。
于是经过两个小时的排查,终于找到了问题所在。这是因为下面的命令在 .bashrc
.
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
这可以防止在 ssh <host> <command>
的环境中执行之后的任何操作。
如果您遇到类似问题,请尝试检查 .bashrc
文件的开头。