Befehl basierend auf Vorschlag bearbeitet

Befehl basierend auf Vorschlag bearbeitet

Ich versuche, PS1 an Remote-Systeme anzuhängen /etc/profile. Jetzt muss ich diese Zeichenfolge an mehr als 70 Server anhängen, also sshwerde 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' "

Bildbeschreibung hier eingeben

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 sedBefehl als auch den Dateinamen zu umfassen, sodass, nachdem die Remote-Shell die Anführungszeichen verarbeitet hat, sedein 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 printfgibt 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 ;

verwandte Informationen