2016-04-30 67 views
-1

我嘗試下面的命令,並得到了一個錯誤:挑戰:爲逃避SSH大括號命令

$ ssh -q rmthost "bash -c 'cat /var/tmp/5|awk '''{print \$1}''' >/var/tmp/redirect 2>&1'" 
Missing } 

(注:「慶典-c'是必要的,因爲對rmthost帳戶的登錄shell是csh )

禁用括號擴展不起作用:

$ set +B 

我也試過:

$ ssh -q rmthost "bash -c 'cat /var/tmp/5|awk ''''{'print \$1'}''''>/var/tmp/redirect 2>&1'" 
awk: syntax error near line 1 
awk: illegal statement near line 1 

中級腳本文件會做,但我更喜歡單行程序,因爲我有10多個這樣的類似命令需要在不同的時間點運行。

有沒有辦法在這種情況下逃避大括號?

謝謝。

+0

單引號會阻止變量擴展。很可能你根本不需要任何轉義 – user3159253

+0

bash -c字符串已經有單引號,所以awk命令中的單引號也需要轉義。這是棘手的部分。 – AlexL

回答

3

我玩了一小會兒......我想你真正想做的是「簡化」。我的本地shell是bash,而我的遠程是tcsh ...這是我想到的功能(與您的文件名一致)。

ssh -q rmthost "awk '{ print \$1 }' /var/tmp/5" 

殼牌逃逸足夠棘手,你真的要想想「爲什麼」你想要做這樣的事情(在尊重,比方說,要撬動一箇中間腳本文件)。

也許更好的是使用切?

ssh -q rmthost 'cut -f1 /var/tmp/5' 

如果外殼封裝和重定向是絕對必要的...(請注意:符號逃生。)

ssh -q rmthost "sh -c \"awk '{ print $1 }' /var/tmp/5\" \&> /var/tmp/redirect" 
+0

嗨邁克,我需要bash -c員工因爲遠程登錄shell是csh,而我想在rmthost上運行的真實命令包括bash樣式輸出重定向,如2>&1。它可以通過中間腳本文件來完成。但我更喜歡命令行,因爲我有很多不同的命令在不同的時間點在遠程服務器上運行...... – AlexL

+0

我在我的答案中添加了一個條款...對我來說,關鍵只是從簡化版本。最後一個技巧是逃避&符 - 可能這是一個csh的事情。由於我的設置與您的設置非常接近,所以我的腳本很可能會起作用(並且直接回答您的問題),但我也鼓勵您也看看jil的答案,因爲他/她可以讓您編寫多行腳本更方便。真正的答案可能在兩者之間。 –

0

與定界符(也沒用使用貓的淘汰)嘗試:

ssh -q rmthost <<'EOI' 
bash -c "awk '{print $1}' </var/tmp/5> /var/tmp/redirect 2>&1" 
EOI