Ich habe bereits einen SSH-Agenten eingerichtet und kann Befehle auf einem externen Server im Bash-Skript ausführen, indem ich folgende Aufgaben ausführe:
ssh blah_server "ls; pwd;"
Nun möchte ich wirklich viele lange Befehle auf einem externen Server ausführen. All dies zwischen Anführungszeichen zu setzen, wäre ziemlich hässlich, und ich würde es wirklich lieber vermeiden, mehrmals zu ssh'en, nur um dies zu vermeiden.
Gibt es eine Möglichkeit, dies auf einmal in Klammern oder so zu tun? Ich suche etwas in der Art von:
ssh blah_server (
ls some_folder;
./someaction.sh;
pwd;
)
Grundsätzlich bin ich mit jeder Lösung zufrieden, solange sie sauber ist.
Bearbeiten
Zur Verdeutlichung spreche ich davon, dass dies Teil eines größeren Bash-Skripts ist. Andere müssen sich möglicherweise später mit dem Skript befassen, daher möchte ich es sauber halten. Ich möchte kein Bash-Skript mit einer Zeile haben, die so aussieht:
ssh blah_server "ls some_folder; ./someaction.sh 'some params'; pwd; ./some_other_action 'other params';"
weil es extrem hässlich und schwer zu lesen ist.
ssh
Aufruf aufzurufen ?scp
,ssh
und laufen. Das wird der sauberste Weg, denke ich.Antworten:
Wie wäre es mit einem Bash Here-Dokument :
Um die von @Globalz in den Kommentaren erwähnten Probleme zu vermeiden, können Sie möglicherweise (abhängig davon, was Sie auf der Remote-Site tun) die erste Zeile durch ersetzen
Beachten Sie, dass Sie im Here-Dokument eine Variablensubstitution durchführen können, sich jedoch möglicherweise mit Anführungszeichenproblemen befassen müssen. Wenn Sie beispielsweise die "Grenzzeichenfolge" (dh
EOF
oben) angeben, können Sie keine Variablensubstitutionen durchführen. Ohne Angabe der Grenzwertzeichenfolge werden Variablen ersetzt. Wenn Sie beispielsweise$NAME
oben in Ihrem Shell-Skript definiert haben , können Sie dies tunund es würde eine Datei auf dem Ziel
otherhost
mit dem Namen dessen erstellen, was Sie zugewiesen hatten$NAME
. Es gelten auch andere Regeln für das Zitieren von Shell-Skripten, die jedoch zu kompliziert sind, um hier darauf einzugehen.quelle
Bearbeiten Sie Ihr Skript lokal und leiten Sie es dann in ssh weiter, z
wo
commands-to-execute-remotely.sh
sieht aus wie deine Liste oben:quelle
( echo $mycmd $myvar ; ...) | ssh myhost
- wie bei der Verwendung von cat wissen Sie genau, was in den ssh-Befehlsstrom fließt. Und natürlich kann die Unterschale im Skript aus Gründen der Lesbarkeit mehrzeilig seincommands-to-execute-remotely.sh
?$localvar
:, um eine lokal definierte Variable\$remotevar
zu interpretieren, eine remote definierte Variable remote zu interpretieren\$(something with optionnal args)
und die Ausgabe von etwas zu erhalten, das auf dem Remote-Server ausgeführt wird. Ein Beispiel, das Sie durch 1 ssh (oder, wie hier gezeigt, mehrere ssh-Befehle):echo " for remotedir in /*/${localprefix}* ; do cd \"\$remotedir\" && echo \"I am now in \$(pwd) on the remote server \$(hostname) \" ; done " | ssh user1@hop1 ssh user2@hop2 ssh user@finalserver bash
ssh blah_server < commands-to-execute-remotely.sh
?Um Ihrem Beispielcode zu entsprechen, können Sie Ihre Befehle in einfache oder doppelte Qoutes einschließen. Zum Beispiel
quelle
Ich sehe zwei Möglichkeiten:
Zuerst machen Sie eine Steuerbuchse wie folgt:
und führen Sie Ihre Befehle aus
Auf diese Weise können Sie einen ssh-Befehl schreiben, ohne die Verbindung zum Server wiederherzustellen.
Die zweite Möglichkeit besteht darin, das Skript dynamisch zu generieren,
scp
auszuführen und auszuführen.quelle
Dies kann auch wie folgt erfolgen. Fügen Sie Ihre Befehle in ein Skript ein, nennen wir es command-inc.sh
Speicher die Datei
Führen Sie es nun auf dem Remote-Server aus.
Für mich nie gescheitert.
quelle
bash -s
gebraucht?#!/bin/bash
wirklich verwendet?ssh user@remote < /path/to/commands-inc.sh
(es scheint für mich zu funktionieren). Nun, ich denke, Ihre Version stellt sicher, dass wir diebash
Shell verwenden und nicht irgendeine andere Shell - das ist der Zweck, nicht wahr?Setzen Sie alle Befehle in ein Skript ein und es kann wie folgt ausgeführt werden
quelle
bash -s
?man
SeitenIf the -s option is present, or if no arguments remain after option processing, then commands are read from the standard input. This option allows the positional parameters to be set when invoking an interactive shell.
bash
Befehl einfach ganz abschaffen können , dhssh remote-user@remote-host <./remote-commands.sh
. Ich habe es versucht und es schien zu funktionieren, obwohl ich nicht sicher bin, ob es in irgendeiner Weise mangelhaft ist.SSH und mehrere Befehle in Bash ausführen.
Separate Befehle mit Semikolons innerhalb einer Zeichenfolge, die an echo übergeben werden und alle in den Befehl ssh geleitet werden. Zum Beispiel:
quelle
Für alle, die hier wie ich stolpern - ich hatte Erfolg damit, dem Semikolon und der Newline zu entkommen:
Erster Schritt: das Semikolon. Auf diese Weise wird der Befehl ssh nicht unterbrochen:
Listet das Remote-Hosts / Home-Verzeichnis auf (als Root angemeldet)
listet das aktuelle Arbeitsverzeichnis auf.
Nächster Schritt: Aufbrechen der Linie:
Dies listete erneut das Remote-Arbeitsverzeichnis auf - verbesserte Formatierung:
Wenn wirklich schöner als hier Dokument oder Zitate um gestrichelte Linien - na ja, nicht ich zu entscheiden ...
(Mit bash Ubuntu 14.04 LTS.)
quelle
ssh host "echo test && ls"
Die veröffentlichten Antworten mit mehrzeiligen Zeichenfolgen und mehreren Bash-Skripten haben bei mir nicht funktioniert.
Hier ist eine funktionale Möglichkeit, mehrere Befehle zu ssh und auszuführen, während der lokale Kontext beibehalten wird.
quelle
Nicht sicher, ob das sauberste für lange Befehle, aber sicherlich das einfachste:
quelle
Dies funktioniert gut zum Erstellen von Skripten, da Sie keine anderen Dateien einschließen müssen:
quelle
-s
flag, ich zitiere ihn, dass du vielleicht davon kommst, die erste Zeile durch ... zu ersetzen , und ich konnte nicht davonkommen, nur Bash zu rufen, an das ich mich nur schwach erinnere.Der einfachste Weg, Ihr System so zu konfigurieren, dass standardmäßig einzelne SSH-Sitzungen mit Multiplexing verwendet werden.
Dies kann durch Erstellen eines Ordners für die Sockets erfolgen:
Fügen Sie dann Ihrer .ssh-Konfiguration Folgendes hinzu:
Jetzt müssen Sie keinen Code mehr ändern. Dies ermöglicht mehrere Aufrufe von ssh und scp, ohne mehrere Sitzungen zu erstellen. Dies ist hilfreich, wenn mehr Interaktion zwischen Ihren lokalen und Remote-Computern erforderlich ist.
Dank der Antwort von @ terminus, http://www.cyberciti.biz/faq/linux-unix-osx-bsd-ssh-multiplexing-to-speed-up-ssh-connections/ und https://en.wikibooks.org / wiki / OpenSSH / Kochbuch / Multiplexing .
quelle