2015-05-14 71 views
2

嵌套引用運行shell命令我有這樣的shell命令:已通過ssh

ssh [email protected] "df | grep /dev/ | \ 
awk 'BEGIN{print "DISK", "%USAGE", "STATUS"} {split($5, a, "%"); \ 
var="GREEN"; print $1, $5, var}' | column -t" 

我需要通過ssh運行這個,但我得到語法錯誤因嵌套雙和單引號的存在。

我試過在引號開頭和結尾之前的轉義字符,但它沒有解決問題。

但是,在運行這會給下面的輸出本地系統:

$ df | grep /dev/ | \ 
awk 'BEGIN{print "DISK", "%USAGE", "STATUS"} {split($5, a, "%"); \ 
var="GREEN"; print $1, $5, var}' | column -t 
DISK  %USAGE STATUS 
/dev/sda1 95%  GREEN 

感謝

+0

的可能重複[如何逃脫的SSH /遠程bash命令的單引號字符?(HTTP:/ /stackoverflow.com/questions/20498599/how-to-escape-the-single-quote-character-in-a-ssh-remote-bash-command) – 2015-05-14 10:39:55

+0

請注意,唯一必須在遠程服務器上運行的是'df'命令。 'grep'可以在本地運行,儘管在遠程服務器上運行它會減少發回的數據量(而不是'df'產生*那麼多的數據)。其餘的你可以在本地執行。 – chepner

回答

6

帶引號的定界符允許省略外報價:

ssh [email protected] <<'END' 
df | grep /dev/ | awk 'BEGIN{print "DISK", "%USAGE", "STATUS"} {split($5, a, "%"); var="GREEN"; print $1, $5, var}' | column -t 
END 
+0

@ glen jackman,謝謝你的解答。 – Yash

3

這是這裏文件來得方便的情況:

ssh -t -t [email protected]<<'EOF' 
df | awk 'BEGIN{print "DISK", "%USAGE", "STATUS"} /dev/{split($5, a, "%"); var="GREEN"; print $1, $5, var}' | column -t 
EOF 
+1

感謝您的解決方案。 – Yash

1

這是更簡單,只是用awk運行df | grep遠程,並處理輸出本地:

ssh [email protected] 'df | grep /dev' | awk ' 
    BEGIN{print "DISK", "%USAGE", "STATUS"} 
    {split($5, a, "%"); var="GREEN"; print $1, $5, var}' | column -t 
+0

我正在將其與基於HTTP的監視工具進行集成,該工具的框架不允許本地處理。那麼我可以做到這一點,但我正在尋找一個更簡單的解決方案。 – Yash

+0

這是遠程運行一切的一個很好的理由:) – chepner

+0

是的,只是得到結果和顯示就簡單多了。上述命令僅僅是一個較大命令的一小部分,它有一個溫和複雜的邏輯,根據「%used」改變「STATE」的值。 – Yash