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

cod*_*ter 4 linux shell bash ssh

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

ssh myhost sh -c 'echo starting; who -b; date; echo $SHELL'
Run Code Online (Sandbox Code Playgroud)

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

         system boot  2016-12-22 20:22
Thu Jan 26 06:12:52 UTC 2017
/bin/bash
Run Code Online (Sandbox Code Playgroud)

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

ssh myhost 'echo starting; who -b; date; echo $SHELL'
Run Code Online (Sandbox Code Playgroud)

输出:

starting
         system boot  2016-12-22 20:22
Thu Jan 26 06:18:28 UTC 2017
/bin/bash
Run Code Online (Sandbox Code Playgroud)

问题:

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

小智 8

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

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

(sh -c echo starting); who -b; date; echo $SHELL
Run Code Online (Sandbox Code Playgroud)

外部引号被剥离,只剩下echo startingrun insh这就是为什么$SHELL设置为/bin/bash.

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

但是,您可以通过简单地将命令包装在另一组引号中来解决这两个问题,从而为您留下

ssh myhost sh -c '"echo starting; who -b ; date; echo $SHELL"'
Run Code Online (Sandbox Code Playgroud)

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

ssh myhost 'sh -c "echo starting; who -b ; date; echo $SHELL"'
Run Code Online (Sandbox Code Playgroud)