
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 foobar
auf dem Server ausgeführt.
Antwort2
(Dies ist eine Fortsetzung vonmein Kommentar zur akzeptierten Antwort.)
Beachten Sie, dass $myparameter
es auf der Serverseite aufgeteilt wird, wenn es Leerzeichen enthält. Bashs printf hat ein %q
Format, 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, $myparameter
dassnichtenthalten einfache Anführungszeichen (sonst sieheHieroder verwenden Sie die printf '%q' ...
Lösung von janmoesen), Sie können einfach einfache Anführungszeichen setzen, $myparameter
um 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