Linux

通過 ssh 執行時出現奇怪的“sh -c”行為

  • December 20, 2017

我正在嘗試執行一些命令,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 with sh -c

這裡發生了一些不同的不直覺的事情。

首先,您對遠端主機的命令被解析為

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

外部引號被剝離,只剩下echo startingrun insh這就是為什麼$SHELL設置為/bin/bash.

其次,由於此答案中所述的原因,未列印“開始”: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"'

引用自:https://unix.stackexchange.com/questions/340221