Ssh

ssh遠端命令執行引用

  • April 17, 2015

我發現這個解決方案對我有用,但我不明白它是如何工作的,因為 sed 命令將它自己的參數括在單引號中,並且整個 ssh 命令也用單引號傳遞。這是從 OSX (bsd) 執行的。

ssh -t -p 22 root@thehost 'for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -i 's/^RS=paper_lantern$/RS=x3/' /var/cpanel/users/${user}; fi; done'

有人可以向我解釋為什麼這有效,為什麼我不需要轉義 sed 命令的單引號 - 我在任何地方都找不到參考?謝謝。

你不需要,因為你的 sed 字元串不必被引用,事實上,在遠端伺服器上,它沒有被引用。

作為參數傳遞給 ssh 命令的內容如下所示:

for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -i s/^RS=paper_lantern$/RS=x3/ /var/cpanel/users/${user}; fi; done

它工作正常,因為 sed 命令的參數內沒有空格。

如果你想傳遞一個帶空格的 sed 參數,你應該像這樣轉義你的單引號:

'for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -i '\''s/^RS=paper_lantern$/RS=x3/'\'' /var/cpanel/users/${user}; fi; done'

使用單引號,您不能像這樣轉義單引號:\'

你必須使用一個技巧。您必須關閉報價,轉義'並重新打開報價。( '\'')

引用自:https://serverfault.com/questions/683394