根據建議編輯命令

根據建議編輯命令

我正在嘗試將 PS1 附加到遠端系統的/etc/profile.現在我必須在 70 多台伺服器上附加此字串,因此ssh我將在所有伺服器上附加此 PS1 字串。但是當我嘗試發送 PS1 時它掛起,我必須終止該命令

這是命令

ssh -v admin@remserv  "sed  '/002/a \ PS1=" \[\e[31m\]\n------------------------------------------------------------------------------------------------------------------------------ \n\n[\u@\h \W]\\$ - \# \[\e[0m\] " /etc/profile' "

在此輸入影像描述

我在這裡缺少什麼?

根據建議編輯命令

> ssh -vt admin@remserv printf "%s\n" "sudo sed -i.bak '/002/a \
> PS1="
> '\[\e[31m\']'\'n------------------------------------------------------------------------------------------------------------------------------ '\'n'\'n'[\u@\h \W']'\\'$ - '\'# '\[\e[0m\']  " /etc/profile' "

答案1

ssh ... "sed  '/002/a \ PS1=" \[\e[31m\]\n--...- \# \[\e[0m\] " /etc/profile' "
              ^             ^                                 ^             ^

帶引號的字串中有兩個不帶引號的雙引號,它們將被 shell 刪除(在 ssh 連接的本地端)。另外,內部單引號似乎跨越sed命令和文件名,因此在遠端 shell 處理引號後,sed將獲得一個帶有/002/a \ ... /etc/profile.這實際上顯示在圖像中的 ssh 輸出上。

(好吧,至少我想到的是,雙引號問題對我的大腦來說不太好,至少在沒有足夠的咖啡的情況下。)

您應該能夠透過運行類似的命令來調試它

ssh somewhere printf '"%s\n"'  "sed '/002/... /etc/profile' "

printf列印它獲得的參數,每行一個,因此更容易看到字串實際分割的位置(echo 將與空格連接,因此foo, bar, 看起來與 相同foo bar)。格式字串上的雙引號可以使反斜線在遠端保持完整。

答案2

好的,使用 '\' 字元解決這個問題

正確的命令

for i in `cat serverslist`; do  ssh -t admin@$i  "sudo sed -i.bak '/002/a \ PS1="\" '\\'['\\'e[31m'\\']'\\n'------------------------------------------------------------------------------------------------------------------------------  '\\'n'\\'n['\\'u@'\\'h '\(''\\'W'\)']'\\''\\'$ - '\\'# '\\'['\\'e[0m'\\']   \"" ' /etc/profile " ;done ;

相關內容