簡體   English   中英

通過ssh執行復雜命令時的語法錯誤

[英]Syntax errors when executing a complex command via ssh

我想知道服務器是否正在運行,如果沒有,那么我想啟動它。 對於這種情況,我編寫了以下bash腳本

ssh -t machine "cd /to/the/bin/path 
  && if [ -n $(sudo -u dev ps U dev | grep server_name | awk 'FNR == 1 {print $1}') ] 
     then 
          echo 'podsvr is running with 
             id $(sudo -u dev ps U dev | grep POD | awk 'FNR == 1 {print $1}')' 
     else 
          sudo -u dev sfservice server_name start 
     fi
"

當我運行上述程序時,出現以下錯誤

bash:-c:第1行:語法錯誤:文件意外結束

有人可以在這方面幫助我嗎

〜蘇尼爾

您不能在bash中嵌套這樣的單引號。 更改第二次出現:

 'FNR == 1 {print $1}'

至:

'\''FNR == 1 {print $1}'\''

您的報價搞砸了。 可能的主要問題是您將整個ssh腳本放在了雙引號中。 由於它包含在雙引號中,因此$(...)部分已經在本地計算機上進行了評估,然后再將結果傳遞給遠程計算機,並且結果相當荒謬。 我將使用以下配方:

  1. 編寫應在遠程計算機上執行的腳本。 最好登錄到遠程計算機並在那里進行測試。

  2. 現在,將整個腳本用引號引起來,並用'\\''或用'"'"'替換每個包含的'

  3. 在該命令包含應該在本地計算機上進行評估的變量情況下,把'\\'"在它的前面和"\\''之后。 例如,如果要在遠程計算機上執行的命令是

     foo "$A" "$B" 'some string' bar 

    但是應該在本地計算機上評估$B

     'foo "$A" '\\'"$B"\\'' '\\''some string'\\'' bar' 

    3.1 注意:這不是絕對安全的方法-如果$B中的字符串包含' ,它將失敗。 為了安全起見,在無法保證$B內沒有'下,您可以先執行QQ=\\'\\\\\\'\\' ; ProtectedB=${B//\\'/$QQ} QQ=\\'\\\\\\'\\' ; ProtectedB=${B//\\'/$QQ} ,然后在上面的命令中使用'\\'"$ProtectedB"\\''而不是'\\'"$B"\\''

  4. 將結果用作ssh的參數。

我認為以下工作有效(但我無法在此處進行測試)。

ssh -t machine '
    cd /to/the/bin/path
    && if [ -n "$(sudo -u dev ps U dev | grep server_name | awk '\''FNR == 1 {print $1}'\'')" ]
       then
           echo "podsvr is running with id $(sudo -u dev ps U dev | grep POD | awk '\''FNR == 1 {print $1}'\'')"
       else
           sudo -u dev sfservice server_name start
       fi
'

您可以做一些事情來改進命令並簡化引用:

  1. 無需使用sudo運行ps即可查看以其他用戶身份運行的進程。
  2. 使用-q選項可抑制grep的輸出,只需檢查退出狀態以查看是否找到匹配項。
  3. 使用帶有echo雙引號可以擴展svc_id參數。
  4. ssh的參數在整個命令周圍使用單引號。
  5. 大概, /to/the/bin/pathsfservice 您可能只需要指定運行命令的完整路徑即可,而不用更改工作目錄。

ssh -t machine 'if ps U dev -o command | grep -q -m1 server_name; then
                  svc_pid=$( ps U dev -o pid,command | grep -m1 POD | cut -d" " -f 1 )
                  echo "podsvr is running with id $svc_pid"
                else 
                  sudo -u dev /to/the/bin/path/sfservice server_name start 
                fi
'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM