Remote-Skript mit lokalem Parameterwert ausführen

Remote-Skript mit lokalem Parameterwert ausführen

Wie kann ich diese Aufgabe automatisieren?

1) Sie befinden sich bei A. 2) Sie greifen per SSH auf B zu. 3) Sie führen bei B ein Skript aus, das einen bei A bekannten Parameter benötigt.

Zuerst dachte ich, ich könnte den Wert vielleicht senden, wenn ich die Verbindung mit SSH öffne. Dann, wahrscheinlich einfacher, zwischen 1) und 2), das gesamte Skript per SCP an denselben Speicherort bei B senden (und das alte ersetzen). Aber trotzdem, wie mache ich das?ausführendas Skript bei B? (Das heißt, wie kann ich diesen letzten Schritt automatisieren? Natürlich könnte ich es nach SSH manuell ausführen.)

Noch ein Gedanke: Vielleicht sollte ich SSH ganz aufgeben. Ich habe eine Webseite bei B, könnte das Skript also irgendwie über eine „unter der Haube“ liegende Weboberfläche aufgerufen werden?

Oder würden Sie es ganz anders machen?

Antwort1

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

Dies wird myscript foobarauf dem Server ausgeführt.

Antwort2

(Dies ist eine Fortsetzung vonmein Kommentar zur akzeptierten Antwort.)

Beachten Sie, dass $myparameteres auf der Serverseite aufgeteilt wird, wenn es Leerzeichen enthält. 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

Antwort3

Wenn man davon ausgehen kann, $myparameterdassnichtenthalten einfache Anführungszeichen (sonst sieheHieroder verwenden Sie die printf '%q' ...Lösung von janmoesen), Sie können einfach einfache Anführungszeichen setzen, $myparameterum das Split-on-Space-Problem 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")"

Antwort4

Ich zögere, eine 10-jährige Frage zu beantworten, insbesondere wenn es bereits eine vollkommen gute Antwort gibt, aber beachten Sie, dass das „Remote“-Skript nicht wirklichbrauchenüberhaupt auf B zu sein. Dies (a) macht die Parametersubstitution trivial und (b) beseitigt die Komplikation, ob es überhaupt eine gute Idee ist, das Skript auf dem Remote-System zu haben (Sicherheitsprobleme/was auch immer).

Die Alternative besteht darin, SSH einfach auszuführen mithier docEingabe. In diesem Fall erfolgt die Parametersubstitutionörtlich, und nicht auf dem Remote-System (solange Sie das Doc-Trennzeichen nicht in Anführungszeichen setzen, in diesem Fall EOF):

portnum=1234
[email protected]
mydir=/var/www/bar
param=foo

ssh -p$portnum $target /bin/bash <<EOF
  set -e;
  cd $mydir;
  # create remote 3-character file '/var/www/bar/myfile' containing 'foo'
  echo -n $param > myfile
EOF

verwandte Informationen