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 sed
Skript 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 sed
lesen kann , funktioniert dies wahrscheinlich (andernfalls versuchen Sie es beispielsweise auf einigen BSD-Systemen mit ).sed
-f -
-f /dev/stdin
Der Befehl ruft sed
den Remote-Host auf und übergibt das sed
Bearbeitungsskript über die Standardeingabe. Das sed
Skript 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 sed
Skript (um es nur zu vermeiden, es MASQUERADE_AS
zweimal zu erwähnen):
s/dnl \(MASQUERADE_AS\).*/\1(`domain.com')dnl/