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 ssh
agregaré 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' "
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 sed
comando como el nombre del archivo, por lo que después de que el shell remoto maneje las comillas, sed
obtendrá 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á printf
los 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
, bar
se 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 ;