通过 ssh 运行时出现奇怪的“sh -c”行为

通过 ssh 运行时出现奇怪的“sh -c”行为

我正在尝试运行一些命令,ssh并对以下行为感到困惑sh -c

ssh myhost sh -c 'echo starting; who -b; date; echo $SHELL'

输出(注意:echo 的输出只是一个空行!)

         system boot  2016-12-22 20:22
Thu Jan 26 06:12:52 UTC 2017
/bin/bash

如果没有sh -c我得到正确的输出:

ssh myhost 'echo starting; who -b; date; echo $SHELL'

输出:

starting
         system boot  2016-12-22 20:22
Thu Jan 26 06:18:28 UTC 2017
/bin/bash

问题:

  1. 为什么不能正确sh -c处理echo starting命令?它输出一个空行。
  2. 为什么SHELL 设置为/bin/basheven sh -c

答案1

这里发生了一些不同的、不直观的事情。

首先,您对远程主机的命令被解析为

(sh -c echo starting); who -b; date; echo $SHELL

外部引号被去掉,只留下echo startingrun insh这就是为什么$SHELL设置为/bin/bash

其次,由于此答案中所述的原因,未打印“starting”:https://unix.stackexchange.com/a/253424

但是,您可以通过简单地将命令括在另一组引号中来解决这两个问题,这样您就可以

ssh myhost sh -c '"echo starting; who -b ; date; echo $SHELL"'

尽管我认为如果将单引号移出以包含命令,则会更清楚sh

ssh myhost 'sh -c "echo starting; who -b ; date; echo $SHELL"'

相关内容