【问题标题】:SSH remote machine and execute commandSSH远程机器并执行命令
【发布时间】:2017-08-14 23:00:25
【问题描述】:

我正在 ssh 到远程机器并执行命令,但我在远程机器上的 $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 /,它会显示来自远程机器的目录,这意味着我已登录到远程机器

【问题讨论】:

    标签: linux ssh su


    【解决方案1】:

    让我们使用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 正在使用未扩展命令而不是扩展命令运行,我们得到远程PATH 作为回报。

    【讨论】:

    • 打印的 $PATH 不同,但它仍然与我 ssh 到远程计算机然后在远程计算机控制台上执行 echo $PATH 时打印的不同。
    • 这很可能是远程主机上的配置问题。您可以尝试使用 ssh -tt you@yourhost bash -ilc "'echo \$PATH'" 来解决它,以使用 tty 伪造交互式登录 shell。
    【解决方案2】:

    使用-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 在执行前不会扩展。

    【讨论】:

    • @PMat,“不起作用”是什么意思?运行该命令时会发生什么?输出会有帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-03-29
    • 2012-12-05
    • 2010-12-25
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    相关资源
    最近更新 更多