我正在嘗試將 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 ;