2013-04-05 259 views
1

我正在嘗試使用SSH運行多個命令,但我沒有得到我的語法。有人能給我一些幫助嗎?通過ssh運行多個命令

ssh "$USER"@"$IP" " \ 
    CURRENT_HOSTNAME=$(hostname); \ 
    sed -c -i 's/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/' $DISTRO_FILE; \ 
    sed -c -i 's/$CURRENT_HOSTNAME/$REPLACEMENT_VALUE/' $CONFIG_FILE; \ 
    hostname $REPLACEMENT_VALUE" 

這些命令正常工作,如果他們是在本地運行,但我想通過SSH運行它們時收到以下錯誤:

sed: -e expression #1, char 0: no previous regular expression 

看來錯誤來自

sed -c -i 's/$CURRENT_HOSTNAME/$REPLACEMENT_VALUE/' $CONFIG_FILE; \ 

,因爲它試圖讀取SSH本身之前設置的$ CURRENT_HOSTNAME。我不知道如何讀回變量。有任何線索嗎?

編輯代碼:

ssh "$USER"@"$IP" "CURRENT_HOSTNAME=\$(hostname); 
    sed -c -i \"s/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/\" $DISTRO_FILE; 
    sed -c -i \"s/\$CURRENT_HOSTNAME/$REPLACEMENT_VALUE/\" $CONFIG_FILE; 
    hostname $REPLACEMENT_VALUE" 

這工作!非常感謝!

謝謝。

回答

3

在將參數發送到遠程機器之前,所有帶雙引號的變量都將由Bash評估。

如果您想保留$variable,您需要使用單引號(在您的命令中轉義單引號),或者轉義您希望在服務器端評估的所有美元符號。

您也不需要換行換行並使用分號。所有換行符都將包含在參數中。

+0

謝謝喬納森,我已經取得了進展。我現在明白了這個想法。我現在有一個問題,因爲我有本地變量(在本地bash腳本中),一個遠程變量(CURRENT_HOSTNAME)和sed抱怨雙引號。我正在更新上面的代碼。 – user1777907 2013-04-05 18:14:27

+0

我得到了工作代碼(編輯中的解決方案)。非常感謝喬納森! – user1777907 2013-04-05 18:44:45