我在远程 Debian 服务器计算机上有一个脚本,我想通过调用来运行命令:
ssh server "find.sh"
我的查找.sh脚本位于:
/home/user/bin
首先,我跑了ssh 服务器“回显 $PATH”它用以下路径响应:
/home/user/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
所以看起来 PATH 变量是可以的,但它不起作用。我可以让它工作的唯一方法是调用完整路径:
ssh server "/home/user/bin/find.sh"
有没有简单的方法可以使其在不指定完整路径的情况下工作?
答案1
您需要在目标服务器上的文件$PATH
中的~/.bashrc
文件开头定义:
export PATH=$PATH:/home/user/bin
https://stackoverflow.com/questions/940533/how-do-i-set-path-such-that-ssh-userhost-command-works:
Bash 以非交互模式读取文件 ~/.bashrc
答案2
ssh server "echo $PATH"
与 的操作模式不同ssh server "find.sh"
。第一个包含 shell 元字符(特别是空格),因此将由“sh -c '指定命令'”运行;第二个没有,因此将由“exec('specified_command')”运行。差异很微妙,但在这种情况下(因为是 shell 设置环境变量)会产生您可能没有预料到的副作用。
您可以通过执行类似的操作来强制 shellssh server 'bash -c "find.sh"'
答案3
打字ssh server "echo $PATH"
将在PATH
本地扩展。因此,您实际执行的命令是ssh server "echo /home/user/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
,并且服务器每次收到该命令时都会产生相同的输出,无论PATH
服务器端有什么。如果你想PATH
在服务器端扩展你可以使用:ssh server 'echo "$PATH"'
代替。请注意,使用单引号来防止 的本地扩展$PATH
。