2016-11-04 151 views
0

執行ssh命令後面跟着帶引號的遠程命令和沒有引號的遠程命令之間有什麼區別?ssh命令和引號

E.g.是什麼區別:

ssh remotehost tar xf archivename.tar 

ssh remotehost "tar xf archivename.tar" 

或什麼區別:

ssh remotehost <path to script>/myscript.sh param 

ssh remotehost "<path to script>/myscript.sh param" 

回答

2

尾隨參數被組合成一個傳遞給的單個字符串作爲遠程計算機上登錄shell的-c選項的參數。在你的第一個例子中,沒有什麼區別。然而,考慮以下因素:

$ ssh remotehost echo * 

這裏,*是本地展開,並將結果傳遞到遠程計算機。在我的機器,我的工作目錄由含有撇號(單引號)單個條目,所以遠程主機試圖像

bash -c "echo chepner's folder" 

這當然導致錯誤運行命令。

$ ssh remotehost "echo *" 

現在遠程主機獲取文字*,但它是受被傳遞到bash -c之前shell擴展。因此,您輸出遠程主機上主目錄中的所有文件。

$ ssh remotehost "echo \*" 

最後,遠程shell獲取其輸入引述星號,所以你得到一個字面*作爲輸出。

+0

如果我寫'ssh remotehost rm -rf $ dir/*'會發生什麼? – griboedov

+0

變量和glob將在客戶端擴展,並且具有這些名稱的所有文件都將在服務器上刪除。 –

1

引號可防止特殊字符的擴展。

想象一下,如果您的命令中有任何要執行的遠程命令(;, &, &&, |, ||, >, >>等)。它們在實際到達遠程主機之前會生效,因爲bash不會知道它全部只是ssh的一個參數。

此外,如果您的腳本路徑中包含更多的空間,他們會迷路,腳本不會被發現。