根据建议编辑命令

根据建议编辑命令

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

相关内容