Mit Linux, Bash und OpenSSH kann ich ein Shellskript auf einem Remote-Host auf mindestens drei Arten ausführen:
# Method 1: Script is never stored on the remote host
ssh <username>@<hostname> 'bash -s' < myShellScript
# Method 2: Script is permanently stored on the remote host
ssh <username>@<hostname> 'myShellScript'
# Method 3: Copy script to the remote host, execute it, and delete it
scp myShellScript <username>@<hostname>:~
ssh <username>@<hostname> 'myShellScript; rm -f myShellScript'
Ich ziehe Methode 1 der Methode 2 vor, da sie die Verbreitung von Skriptkopien und die damit verbundenen Wartungsprobleme verhindert.
Ich ziehe Methode 1 der Methode 3 vor, weil sie schneller und in der Regel "sauberer" ist, als das Skript zu kopieren und zu löschen.
Aber es gibt ein Problem, das ich umgehen muss, um mein Ziel zu erreichen bei Methode 1 bleiben myShellScript ist von dieser Form:
#!/bin/bash
# Do stuff...
myProgram input myProgramInputFile
# Do more stuff...
Hier, meinProgramm ist ein Standard-Dienstprogramm, das auf allen Remote-Hosts verfügbar ist, mit denen ich möglicherweise interagieren möchte. Jedoch, myProgramInputFile ist eine reguläre Datei, die nur auf meinem lokalen Computer vorhanden ist. Es ist auf keinem der entfernten Hosts vorhanden.
Ich möchte "bündeln" können myShellScript und myProgramInputFile in ein nettes "Paket", das auf dem Remote-Host über SSH ausgeführt wird, ohne explizit irgendetwas im Remote-Dateisystem zu speichern, entweder dauerhaft oder temporär. Ist das möglich?
myShellScript
macht bestimmte "Sachen". Kennen Sie die Fallstricke, wenn Sie diese Methode weiterhin verwenden.Antworten:
Ich würde lieber wenigstens kopieren
myProgramInputFile
( Methode 3 wie); Ich denke, es wäre robuster. Es gibt jedoch eine Möglichkeit, damit es mit der Sohle funktioniert Methode 1 .Mein Ansatz
Ich empfehle Ihnen, ein (lokales) Skript zu erstellen, das die entsprechende Datei auf die Remote-Seite kopiert, die Ausführung auslöst und anschließend bereinigt.
Wir benötigen drei lokale Dateien:
myLocalScript
(ausführbar),myRemoteScript
undmyProgramInputFile
.Der Inhalt von
myLocalScript
:myRemoteScript
sieht so aus:Die Dateien
myProgramInputFile
(lokal) undmyProgram
(Remote) bleibt so wie in Ihrem aktuellen Setup.Lokale Verwendung:
Technische Hinweise und Erklärungen:
mktemp
erstellt eine Datei in einem temporären Verzeichnis auf dem Remote-Computer. Wir wollen nicht verwendenmktemp -u
Um die Situation zu vermeiden, wenn jemand anderes tatsächlich eine Datei mit dem gleichen Namen zwischen uns erstellt Schritt 2 und Schritt 3 .scp
wenn wir verwendet habenmktemp -u
. Die temporäre Remote-Datei ist bereits vorhanden, so dass wir sie verwendencat
zu schreibenmyRemoteScript
muss den Pfad zur temporären Datei im Kontext der Remote-Maschine kennen. Deshalb passieren wir unser Lokal$remote_input
wieinput
Variable zur Fernbedienungbash
. Auf diese Weise wennmyRemoteScript
wird dem besagten zugeführtbash
, das$input
Darin wird der temporäre Dateipfad angezeigt.bash
(sagen wir mit single Ctrl + c ) dannmyLocalScript
wird weitergehen Schritt 5 und mache die Reinigung trotzdem. Dies ist der Grund, warum die Reinigung nicht am Ende istmyRemoteScript
obwohl es sein könnte.Sohle, einzig, alleinig Methode 1 Ansatz
Dank an Hier Dokumente Sie können einbetten
myProgramInputFile
inmyShellScript
.Das wird einfach sein ob
myProgramInputFile
ist eine Textdatei undmyProgram
kann lesenstdin
(vielleicht mitmyProgram input -
Syntax? oder vielleicht wanninput
wurde weggelassen?)myShellScript
sieht so aus:Dann werden wir es wie in ausführen Methode 1 :
Ob
myProgram
kann nicht lesenstdin
Das Remote-System ermöglicht jedoch die Verwendung/proc/self/
dann sollten wir die entscheidende Zeile einschreibenmyShellScript
so was:Ob
myProgramInputFile
ist mehr als text dann sollten wir es lokal codieren (sieheuuencode
.base64
) und decodieren Sie auf der Gegenseite. Wir sollten auch prüfen, ob es keine gibtEOF
Zeile im verschlüsselten Text, ändern Sie hier das Trennzeichen für das Dokument. Beachten Sie, dassbase64
verwendet nicht_
soE_O_F
ist in diesem Fall absolut sicher (aber vielleicht nicht mituuencode
, Ich weiß es nicht).Als ein konzeptioneller Beweiß Ich habe das Super User-Favicon gekippt und mit verschlüsselt
base64
und in das Skript eingebettet. Ich entschied mich zu demonstrieren/proc/self/fd/0
nähern mitcp
aber es könnte seincat > ~/SUfavicon.ico
auch; oder bessergzip -cd > ~/SUfavicon.ico
früher in der Pfeife.Und natürlich würde es in Ihrem Fall geben
myProgram
anstattcp
.Beachten Sie in diesem Fall
{}
sind wichtig, sie machen das Dokument hier gerichtetbase64 -d
.Führen Sie es wie zuvor aus:
Dann wirst du finden
~/SUfavicon.ico
auf dem entfernten Rechner.quelle