Führen Sie das Remote-Skript mit dem lokalen Parameterwert aus

8

Wie kann ich diese Aufgabe automatisieren?

1) Sie sind bei A. 2) Sie ssh in B. 3) Sie führen ein Skript bei B aus, das einen bei A bekannten Parameter benötigt.

Zuerst dachte ich, ich könnte den Wert vielleicht senden, als ich die Verbindung mit ssh öffnete. Dann, wahrscheinlich einfacher, zwischen 1) und 2) scp das gesamte Skript an die gleiche Stelle bei B (anstelle des alten). Aber nach wie vor, wie kann ich ausführen das Skript an B? (Das heißt, wie man diesen letzten Schritt automatisiert. Natürlich könnte ich ihn nach ssh manuell ausführen.)

Ein anderer Gedanke, vielleicht ssh ganz verwerfen - ich habe eine Webseite bei B, könnte das Skript also irgendwie über eine "unter der Haube" -Webschnittstelle aufgerufen werden?

Oder würden Sie es ganz anders machen?

Emanuel Berg
quelle
Schauen Sie sich auch Run if-Anweisung auf einem Remote-Computer an
Ulrich Dangel

Antworten:

11
myparameter=foobar
ssh user@server "myscript $myparameter"

Dies wird myscript foobarauf dem Server ausgeführt.

Michael Hampton
quelle
So einfach ist das! Funktioniert super. (Ich musste ein "./" vor den Skriptnamen setzen, weil es sonst gesucht hat ~/.elm/aliases.)
Emanuel Berg
6
Als kleine Warnung ist hier die Verwendung von doppelten Anführungszeichen ( ") im Gegensatz zu einfachen ( ') wichtig. Die Verwendung von double bedeutet, dass die Shell auf Ihrem lokalen Computer die Variable erweitert und dann den sshBefehl ausführt . Wenn einzelne verwendet würden, würde die lokale Shell den Befehl nicht berühren, der wörtlich gesendet wird, aber in der Remote-Shell noch erweitert wird.
Tilo Wiklund
3
Beachten Sie, dass $myparameterLeerzeichen auf der Serverseite aufgeteilt werden , wenn sie Leerzeichen enthalten. Bash's printfhat ein %qFormat, das Sie verwenden können. Ich habe einen Beispielcode, der hier jedoch nicht passt. Ich werde eine neue Antwort darauf erstellen.
Janmoesen
7

(Dies ist eine Fortsetzung meines Kommentars zur akzeptierten Antwort .)

Beachten Sie, dass $myparameterLeerzeichen auf der Serverseite aufgeteilt werden , wenn sie Leerzeichen enthalten. Bashs printf hat ein %qFormat, das Sie verwenden können. Beispiel:

$ myparameter='hello; rm somefile'
$ ssh user@server "echo $myparameter"
hello
rm: cannot remove `somefile': No such file or directory

$ ssh user@server "echo $(printf '%q' "$myparameter")"
hello; rm somefile
janmoesen
quelle
1

Wenn es sicher ist , anzunehmen , dass $myparameterwird nicht einfache Anführungszeichen enthalten (ansonsten siehe hier oder benutzen printf '%q' ...Lösung von janmoesen), können Sie nur um einfache Anführungszeichen setzen $myparameterdie Split-on-Raumproblem auf der Serverseite zu vermeiden.

myparameter="foo \" bar"
#myparameter="foo \" ' bar"

ssh localhost "set -xv; printf '%s\n' myscript '${myparameter}'"
ssh localhost "set -xv; echo $(set -xv; printf '%q' "$myparameter")"
marc
quelle