Comando editado según sugerencia

Comando editado según sugerencia

Estoy intentando agregar PS1 en sistemas remotos /etc/profile. Ahora tengo que agregar esta cadena en más de 70 servidores, por lo que al usarla sshagregaré esta cadena PS1 en todos los servidores. Pero cuando intento enviar la PS1 se cuelga y tengo que matar el comando

Este es el comando

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

ingrese la descripción de la imagen aquí

Que me estoy perdiendo aqui ?

Comando editado según sugerencia

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

Respuesta1

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

Tiene dos comillas dobles sin comillas dentro de la cadena entre comillas, el shell las eliminará (en el lado local de la conexión ssh). Además, las comillas simples internas parecen abarcar tanto el sedcomando como el nombre del archivo, por lo que después de que el shell remoto maneje las comillas, sedobtendrá un argumento con /002/a \ ... /etc/profile. En realidad, eso se muestra en la salida de ssh en su imagen.

(Bueno, al menos eso es lo que me viene a la mente, las comillas dobles no funcionan bien con mi cerebro, al menos sin suficiente café).

Deberías poder depurarlo ejecutando algo como

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

Imprimirá printflos argumentos que obtiene, uno por línea, por lo que es más fácil ver dónde está realmente dividida la cadena (el eco se uniría con espacios, por lo que foo, barse vería igual que foo bar). Coloque comillas dobles en la cadena de formato para mantener intacta la barra invertida en el control remoto.

Respuesta2

Ok, resuelve esto usando los caracteres '\'

Comando correcto

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 ;

información relacionada