Comando editado com base na sugestão

Comando editado com base na sugestão

Estou tentando anexar PS1 no sistema remoto /etc/profile. Agora preciso anexar essa string em mais de 70 servidores, portanto, usando, sshanexarei essa string PS1 em todos os servidores. Mas quando tento enviar o PS1 ele trava e tenho que matar o comando

Este é o comando

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

insira a descrição da imagem aqui

O que estou perdendo aqui ?

Comando editado com base na sugestão

> 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' "

Responder1

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

Você tem duas aspas duplas sem aspas dentro da string entre aspas, elas serão removidas pelo shell (no lado local da conexão ssh). Além disso, as aspas simples internas parecem abranger o sedcomando e o nome do arquivo; portanto, depois que o shell remoto tratar as aspas, sedobterá um argumento com /002/a \ ... /etc/profile. Na verdade, isso aparece na saída do ssh na sua imagem.

(Bem, pelo menos é isso que me vem à mente, problemas com aspas duplas não funcionam bem no meu cérebro, pelo menos sem café suficiente.)

Você deve ser capaz de depurar isso executando algo como

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

O printfirá imprimir os argumentos obtidos, um por linha, então é mais fácil ver onde a string está realmente dividida (echo se juntaria a espaços, então foo, bar, teria a mesma aparência que foo bar). Coloque aspas duplas na string de formato para manter a barra invertida intacta no controle remoto.

Responder2

Ok, resolva isso usando caracteres '\'

Comando Correto

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 ;

informação relacionada