與SSH

2016-02-02 21 views
0

嵌套的grep我有成功運行一個以下Shell命令:與SSH

sed -e "1,/^$(date -d -24hour +'%Y-%m-%d %H')/d" logfile | grep -A20 -B10 'Exception' | mail -s "Sample report" [email protected] 

然而,我必須SSH到特定的計算機來運行此。爲了避免這種情況,我修改了以下導致失敗的方法:

ssh myserver 'sed -e "1,/^$(date -d -24hour +'%Y-%m-%d %H')/d" logfile | grep -A20 -B10 'Exception' | mail -s "Sample report" [email protected] ' 

這個命令有什麼問題?我怎樣才能解決這個問題?

+0

順便說一下,在未來,而不是簡單地「導致失敗」,在你的問題中指定失敗的細節。 –

回答

3

嵌入您在引號定界符代碼,以避免需要進行修改(其本質上是一個容易出錯的過程):

ssh myserver 'bash -s' <<'EOF' 
    sed -e "1,/^$(date -d -24hour +'%Y-%m-%d %H')/d" logfile \ 
    | grep -A20 -B10 'Exception' \ 
    | mail -s "Sample report" [email protected] 
EOF 

在特定的情況下在這裏,明顯的原因,你的原始修改失敗的是內部單引號終止圍繞代碼整體的代碼。

具體來說:

+'%Y-%m-%d %H' 

...在於表達第一'終止命令之前的一個開口,使該空間在語法上不保護。

你可以代替做到以下幾點,因爲你的shell是bash:

ssh myserver $'sed -e "1,/^$(date -d -24hour +\'%Y-%m-%d %H\')/d" logfile | grep -A20 -B10 Exception | mail -s "Sample report" [email protected]' 

$''是一個擴展在其中的反斜槓可以逃避單引號(也可用於其他文字 - \n一個換行符, \t爲選項卡等),功能不適用於典型的POSIX sh語法。

相反,在POSIX SH,一個可以切換引用類型嵌入字面單引號:'foo'"'"'bar'到定義了與兩者foobar單引號,並在它們之間通過單個字面單引號分離的串 - - 完全有效的語法,但不熟悉成語的讀者不一定容易)。

+0

順便提一下,'bash -s'的意義在於允許您以簡單的方式從代碼塊中帶外傳遞參數 - 所以如果您希望您的代碼塊在heredoc中傳遞來引用'「$ 1」 '爲主題的電子郵件地址和''2 $'',你可以使用'printf -v args_str'%q''$ email「」$ subject「'來使它們脫離封殼解釋,然後'ssh myserver「bash -s $ args_str」'。 –