2013-12-10 96 views
13

我正在構建一組用於遠程啓動,停止和檢查進程狀態的腳本。這些腳本的stop應尋找一個進程並殺死它。因此,我做:如何在ssh/remote bash命令中轉義單引號字符?

ssh [email protected] 'kill -9 `ps -ef | grep MapReduceNode | grep -v "grep" | awk -F " " '{print $2}' | head -n 1`' 

的這裏的問題是,AWK標記化步驟需要單引號和這些衝突有用於通過ssh執行遠程命令中使用的單引號。這些單引號如何逃脫?

+0

Try> ssh deploy @ hera'kill -9 \'ps -ef | grep MapReduceNode | grep -v「grep」| awk -F「」「'」{print $ 2}「'」| head -n 1'' – RedX

+0

@RedX這個謝謝你!用它作爲答案,我會接受。 –

回答

18

使用

ssh [email protected] 'kill -9 `ps -ef | grep MapReduceNode | grep -v "grep" | awk -F " " '"'"'{print $2}'"'"' | head -n 1`' 
8

這不是sshawk處理的報價,它是殼(和他們是需要保持外殼由特殊處理的其他字符,如$)。不支持嵌套它們(儘管其他結構,如$()甚至可以在包含引號時嵌套),因此您需要單獨轉義單引號。以下是幾種方法:

$ echo 'Don'"'"'t mess with this apostrophe!' 
Don't mess with this apostrophe! 
$ echo 'Don'\''t mess with this apostrophe!' 
Don't mess with this apostrophe! 
7

您不能在單引號字符串中包含單引號。然而,這並不重要,因爲一個參數可以有不止一個報價段

例如(只要沒有加引號的空格或其他自定界字符):

ssh [email protected] 'kill -9 `ps -ef | 
       grep MapReduceNode | 
       grep -v "grep" | 
       awk -F " " '\''{print $2}'\'" | 
       head -n 1`" 

然而,該命令行是非常笨重。如果可能的話,您應該使用pkill實用程序,該實用程序會將所有這些減少到ssh [email protected] 'pkill -SIGKILL MapReduceNode'

否則,你可以做所有的字符串操作在一個單一的awk調用(未經測試,但我認爲這將工作):

ssh [email protected] 'ps -ef | 
       awk "/[M]apReduceNode/{system(\"kill -9 \"$2)}"' 

(不像原來,這將殺死所有MapReduceNode任務,而不是一些武斷第一個,如果你真的想在一個任務中完成,在awk動作中加上; exit

1

還有兩個選項我沒有在其他答案中看到。我已經離開了的grep/grep的/ AWK /頭管道完好出於演示的目的,即使(在rici's answer提到),它可以減少到像

awk -F ' ' '/MapReduceNod[e]/ {print $2; exit}' 
  1. 使用雙引號爲全SSH命令:

    ssh [email protected] "kill -9 \$(ps -ef | 
    grep MapReduceNode | grep -v \"grep\" | awk -F ' ' '{print \$2}' | head -n 1)" 
    

    請注意,我可以在命令中使用單引號了,但我有逃避其他的事情我不想尚未展開:\$()(我已經使用的,而不是反引號),雙報價\"print \$2

  2. 甲這裏-DOC與引述定界符:

    ssh -T [email protected] <<'EOF' 
    kill -9 $(ps -ef | grep MapReduceNode | grep -v 'grep' | 
    awk -F ' ' '{print $2}' | head -n 1) 
    EOF 
    

    -T防止SSH抱怨不分配一個僞終端。

    帶引號分隔符的here-doc非常好看,因爲它的內容不必根據轉義事物進行修改,它可以包含單引號。

0

另一個例子是處理簡單或雙引號,因爲對於我來說,例如我需要解釋和變量替換。如果我想做一個函數來顯示我的女人macOS的味精我可以做以下事情:

ssh womanLptp "osascript -e 'tell app \"System Events\" to display dialog \"${1}\"'"