![如何确保 SSH 远程 BASH shell 包含所有 PATH 元素](https://linux22.com/image/1485272/%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%20SSH%20%E8%BF%9C%E7%A8%8B%20BASH%20shell%20%E5%8C%85%E5%90%AB%E6%89%80%E6%9C%89%20PATH%20%E5%85%83%E7%B4%A0.png)
因此,我试图在 ssh 上远程运行一个脚本,但是ssh remote "~/bin/some_script.sh"
问题是,vcs
当我尝试通过 ssh 发送命令时,该脚本运行的命令似乎无法加载,而不是通过 ssh 进入远程并手动执行该命令。
为了清楚起见,当我尝试时会出现以下输出
$ ssh remote "cd/...; vcs -x -...;"
bash: vcs: command not found
但当我这样做时它有效
$ ssh remote
remote$ vcs -x -...
remote$ //good output
我对此进行了更深入的研究,当我简单地运行
$ ssh remote "compgen -c | wc -l"
2611
对比
$ ssh remote
remote$ compgen -c | wc -l
3735
因此,当我仅通过 ssh 传递命令时,显然有很多命令没有被“加载”,而当我实际通过 ssh 进入远程并执行命令时则不然。知道发生了什么吗?如何克服这个问题?
答案1
这个问题已在其他地方被多次询问和回答,包括:
- https://stackoverflow.com/questions/940533/how-do-i-set-path-such-that-ssh-userhost-command-works
- https://unix.stackexchange.com/questions/15207/dot-file-not-sourced-when-running-a-command-via-ssh
- https://stackoverflow.com/questions/216202/why-does-an-ssh-remote-command-get-fewer-environment-variables-then-when-run-man
还有很多其他的。我认为第一个是我花了几秒钟找到的最好的答案
答案2
跑步会打开ssh remote "command"
非交互式shell,因此它在打开时不会获取常规文件。我深入研究后发现,在非交互模式下运行时显然$PATH
缺少一些文件。我的解决方案是在运行脚本时获取必要的文件夹/bins
ssh remote "~/bin/some_script.sh"
#!/bin/bash
. /etc/.../sourced_script.sh
# script
唯一的缺点是您必须记住在要远程运行的每个脚本中都引用此脚本。也许有一个更优雅的解决方案,您可以将其添加. /etc/.../sourced_script.sh
到非交互式 shell 的启动脚本中,但我的新手经验不知道是否有非交互式 shell 的启动脚本。