通过ssh命令运行远程脚本

通过ssh命令运行远程脚本

我在远程 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

相关内容