SSH远程机器并执行命令

SSH remote machine and execute command

我正在通过 sshing 连接到远程机器并执行命令,但我在远程机器上的 $PATH 设置为原始机器中用户的 $PATH 而不是 sshed 机器的 $PATH。但是如果我 ssh 到远程机器并执行 echo $PATH,它被正确设置为新机器中的登录用户

root@host1> ssh admin@remotemachine echo $PATH

这会打印用户的 PATH,在本例中是 host1 上的 root 而不是 remotemachine 上的 admin

root@host1> ssh admin@remotemachine 
admin@remotemachine's password: ****
echo $PATH

以上工作正常

基本上它不会将环境更改为远程计算机上的新用户。不知何故,即使我登录到远程机器,它也保留了 host1 的 root 环境。如果我执行 ls -al /,它会显示远程机器的目录,这意味着我已登录到远程机器

让我们使用set -x来调试我们实际运行:

$ set -x
$ ssh localhost echo $PATH
+ ssh localhost echo /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

带有 + 的行告诉我们 实际上 运行 的命令是:

ssh localhost echo /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

不出所料,这也是我们得到的值,不管远程PATH是什么。

我们可以单引号命令来确保我们发送 echo $PATH 而不是 echo /usr/local/bin:... 到服务器:

$ ssh localhost 'echo $PATH'
+ ssh localhost 'echo $PATH'

现在 set -x 显示 ssh 正在 运行 使用未扩展命令而不是扩展命令,我们在 [=33= 中得到远程 PATH ].

使用-t:

ssh admin@remotemachine -t 'echo $PATH'

来自手册页:

 -t      Force pseudo-terminal allocation.  This can be used to execute arbitrary screen-based programs on a
         remote machine, which can be very useful, e.g. when implementing menu services.  Multiple -t
         options force tty allocation, even if ssh has no local tty.

解释有点含糊,但它会执行你放在引号中的任何内容。单引号很重要,这样 $PATH 在执行前不会展开。