Anexa string usando Sed no sistema remoto

2

Estou tentando anexar o PS1 ao /etc/profile do sistema remoto. Agora eu tenho que acrescentar essa string em mais de 70 servidores, então usando ssh , eu adicionarei essa string PS1 em todos os servidores. Mas quando eu tento enviar o PS1 ele trava e eu 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' "

Oqueestouperdendoaqui?

Comandoeditadocombasenasugestão

>ssh-vtadmin@remservprintf"%s\n" "sudo sed -i.bak '/002/a \
> PS1="
> '\[\e[31m\']'\'n------------------------------------------------------------------------------------------------------------------------------ '\'n'\'n'[\u@\h \W']'\'$ - '\'# '\[\e[0m\']  " /etc/profile' "
    
por OmiPenguin 26.10.2016 / 09:58

2 respostas

3

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

Você tem duas aspas duplas não citadas dentro da string citada, elas serão removidas pelo shell (no lado local da conexão ssh). Além disso, as aspas simples internas parecem abranger tanto o comando sed quanto o nome do arquivo, portanto, depois que o shell remoto manipular aspas, sed receberá um argumento com /002/a \ ... /etc/profile . Isso realmente mostra a saída do ssh na sua imagem.

(Bem, pelo menos é o que vem à mente, questões de citação dupla não funcionam bem com o meu cérebro, pelo menos sem café suficiente.)

Você deve poder depurar isso executando algo como

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

O printf imprimirá os argumentos que recebe, um por linha, para que seja mais fácil ver onde a string é realmente dividida (o echo se uniria a espaços, por isso foo , bar teria a mesma aparência %código%). Aspas duplas na string de formato para manter a barra invertida intacta no controle remoto.

    
por 26.10.2016 / 10:12
0

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 ;
    
por 26.10.2016 / 15:57

Tags