我正在尝试将 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 ;