wie verwende ich Anführungszeichen in sed & ssh?

wie verwende ich Anführungszeichen in sed & ssh?

ich kriege das in Bash/Rhel 7 nicht zum Laufen:

ssh host "sed -i -e \"s/dnl MASQUERADE_AS.*\$/MASQUERADE_AS(\`domain.com\')dnl/\" /etc/mail/sendmail.mc"

bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file

ich möchte im Wesentlichen dieses Sed, das auf einer normalen Befehlszeile funktioniert, aber innerhalb von SSH abbricht:

sed -i -e "s/dnl MASQUERADE_AS.*$/MASQUERADE_AS(\`domain.com\')dnl/" /etc/mail/sendmail.mc

hat jemand eine Idee? Sehr dankbar.

Antwort1

Verwenden vonJeffs Ideeder Verwendung eines Here-Dokuments für das sedSkript selbst (nun, er erwähnt einen „Here-String“, aber ich glaube, Sie hätten dort auch Probleme mit der Verwendung von Zitaten):

ssh host 'sed -i -f - /etc/mail/sendmail.mc' <<'SED_END'
s/dnl MASQUERADE_AS.*/MASQUERADE_AS(`domain.com')dnl/
SED_END

Wenn der auf dem Remote-Host ein Skript mithilfe von von der Standardeingabe sedlesen kann , funktioniert dies wahrscheinlich (andernfalls versuchen Sie es beispielsweise auf einigen BSD-Systemen mit ).sed-f --f /dev/stdin

Der Befehl ruft sedden Remote-Host auf und übergibt das sedBearbeitungsskript über die Standardeingabe. Das sedSkript wird aufgrund der Anführungszeichen in in einfache Anführungszeichen gesetzt 'SED_END', sodass die Shell nicht versucht, Elemente in ihrem Text zu erweitern.

Ich habe auch das Trailing $im regulären Ausdruck entfernt, da es nicht benötigt wird ( .*würde sowieso mit dem Zeilenende übereinstimmen).

Ein ganz klein wenig kürzeres sedSkript (um es nur zu vermeiden, es MASQUERADE_ASzweimal zu erwähnen):

s/dnl \(MASQUERADE_AS\).*/\1(`domain.com')dnl/

verwandte Informationen