Ich versuche, PS1 an Remote-Systeme anzuhängen /etc/profile
. Jetzt muss ich diese Zeichenfolge an mehr als 70 Server anhängen, also ssh
werde ich diese PS1-Zeichenfolge an alle Server anhängen. Aber wenn ich versuche, die PS1 zu senden, hängt es und ich muss den Befehl beenden
Dies ist der Befehl
ssh -v admin@remserv "sed '/002/a \ PS1=" \[\e[31m\]\n------------------------------------------------------------------------------------------------------------------------------ \n\n[\u@\h \W]\\$ - \# \[\e[0m\] " /etc/profile' "
Was übersehe ich hier?
Befehl basierend auf Vorschlag bearbeitet
> 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' "
Antwort1
ssh ... "sed '/002/a \ PS1=" \[\e[31m\]\n--...- \# \[\e[0m\] " /etc/profile' "
^ ^ ^ ^
Sie haben zwei nicht in Anführungszeichen gesetzte doppelte Anführungszeichen innerhalb der zitierten Zeichenfolge, die von der Shell (auf der lokalen Seite der SSH-Verbindung) entfernt werden. Außerdem scheinen die inneren einfachen Anführungszeichen sowohl den sed
Befehl als auch den Dateinamen zu umfassen, sodass, nachdem die Remote-Shell die Anführungszeichen verarbeitet hat, sed
ein Argument mit erhalten wird /002/a \ ... /etc/profile
. Das wird tatsächlich in der Ausgabe von SSH in Ihrem Bild angezeigt.
(Zumindest ist das das, was mir in den Sinn kommt, denn mein Gehirn kann mit Anführungszeichen nicht gut umgehen, zumindest nicht ohne ausreichend Kaffee.)
Sie sollten in der Lage sein, das zu debuggen, indem Sie etwas wie ausführen
ssh somewhere printf '"%s\n"' "sed '/002/... /etc/profile' "
Das printf
gibt die erhaltenen Argumente aus, eines pro Zeile, sodass man leichter erkennen kann, wo der String tatsächlich aufgeteilt wird (echo würde mit Leerzeichen verbinden, sodass foo
, bar
, genauso aussehen würde wie foo bar
). Doppelte Anführungszeichen im Formatstring, damit der Backslash für den Remote-Server erhalten bleibt.
Antwort2
Ok, lösen Sie dies, indem Sie '\'-Zeichen verwenden
Richtiger Befehl
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 ;