2017-11-15 3 views
0

Ich möchte den folgenden Befehl von Jenkins auszuführen:Wie übergebe ich einen Befehl, der Sonderzeichen über SSH enthält?

ssh -i ~/.ssh/company.pem -o StrictHostKeyChecking=no [email protected]$hostname "supervisorctl start company-$app ; awk -v app=$app '$0 ~ "program:company-"app {p=NR} p && NR==p+6 && /^autostart/ {$0="autostart=true" ; p=0} 1' /etc/supervisord.conf > $$.tmp && sudo mv $$.tmp /etc/supervisord.conf” 

Dies ist einer der letzten Schritte eines Auftrags ist, die einen Stapel Cloudformation erzeugt.

Das Ausführen des Befehls vom Terminal des Zielservers funktioniert ordnungsgemäß.

In diesem Schritt möchte ich ssh zu jedem der Server (Mitglieder von ASG innerhalb des neuen Stapels) und suchen und ersetzen eine bestimmte Zeile wie oben in der /etc/supervisord.conf gezeigt, im Grunde eine bestimmte Dienst für Autostart .

Wenn ich den Befehl, den ich die folgende Fehlermeldung aus:

Usage: awk [POSIX or GNU style options] -f progfile [--] file ... 
Usage: awk [POSIX or GNU style options] [--] 'program' file ... 

Ich habe versucht, die doppelten Anführungszeichen zu entkommen, aber bekam den gleichen Fehler, eine Ahnung, was ich falsch mache?

+0

Sie könnten die Vorschläge versuchen, die Sie von www.shellcheck.net erhalten – Androbin

Antwort

0

Dieses Problem tritt auf, da die Shell verschachtelte Anführungszeichen verarbeitet. Dies ist ein Anwendungsfall für eine HERE DOKUMENT oder heredoc - A HIER DOKUMENT ermöglicht es Ihnen, mehrzeilige Befehle zu schreiben, die durch bash weitergeleitet werden, ohne sich über Anführungszeichen Gedanken machen zu müssen. Die Struktur ist wie folgt:

$ ssh -t [email protected] <<'END' 
command |\ 
command2 |\ 
END 

< --- Oh ja, die -t an den ssh-Befehl wichtig, da sie die Schale verhalten, wie lassen wissen, ob interaktiv genutzt wird, und vermeidet Warnungen und unerwartete Ergebnisse.

In Ihrem speziellen Fall, sollten Sie so etwas wie versuchen:

$ ssh -t -i ~/.ssh/company.pem -o StrictHostKeyChecking=no [email protected]$hostname <<'END' 
supervisorctl start company-$app |\ 
awk -v app=$app '$0 ~ \"program:company-\"app {p=NR} p && NR==p+6 \ 
&& /^autostart/ {$0="autostart=true" ; p=0} 1' \ 
/etc/supervisord.conf > $$.tmp && sudo mv $$.tmp /etc/supervisord.conf 
END 

Nur eine Anmerkung, da ich nicht über die gewünschte Ausgabe des Befehls sicher sein kann, die ausgeführt wird, geraten wird, den Überblick zu behalten Ihre eigenen " und ' Marken, und ihnen entsprechend in Ihrem awk-Befehl zu entkommen, als würden Sie an einem interaktiven Terminal. Ich bemerke die " 's umund ich bin ein bisschen verwirrt von ihnen Wenn sie ein Teil des Musters in der Zeichenfolge sind, die gesucht werden, müssen sie entsprechend maskiert werden. P.S.

Verwandte Themen