shell - with - ssh run command on remote server




Wie verwende ich SSH, um ein Shell-Skript auf einem Remote-Rechner auszuführen? (7)

Ich muss ein Shell-Skript (Windows / Linux) auf einem Remote-Rechner ausführen.

Ich habe SSH auf beiden Maschinen A und B konfiguriert. Mein Skript ist auf der Maschine A, die einen Teil meines Codes auf einer Remote-Maschine, Maschine B, ausführen wird.

Die lokalen und Remote-Computer können entweder Windows oder Unix-basierte Systeme sein.

Gibt es eine Möglichkeit, dies mit plink / ssh auszuführen?


Angenommen, Sie möchten dies automatisch von einer "lokalen" Maschine aus tun, ohne sich manuell bei der "Remote" -Maschine anzumelden, sollten Sie in eine TCL-Erweiterung namens Expect schauen, die genau auf diese Situation zugeschnitten ist. Die Homepage unten sieht irgendwie beschissen aus, aber lass dich davon nicht abschrecken; Ich habe auch einen Link zu einem Skript für die Anmeldung / Interaktion über SSH zur Verfügung gestellt.

http://expect.nist.gov/

http://bash.cyberciti.biz/security/expect-ssh-login-script/


Das ist eine alte Frage, und Jasons Antwort funktioniert gut, aber ich möchte Folgendes hinzufügen:

ssh [email protected] <<'ENDSSH'
#commands to run on remote host
ENDSSH

Dies kann auch mit su und Befehlen, die eine Benutzereingabe erfordern, verwendet werden. (beachte das ' entkommene heredoc')

Edit: Da diese Antwort immer mehr Traffic bringt, würde ich noch mehr Informationen zu diesem wunderbaren Einsatz von herec hinzufügen:

Sie können Befehle mit dieser Syntax verschachteln, und das ist die einzige Möglichkeit, die Verschachtelung zu funktionieren (auf vernünftige Weise)

ssh [email protected] <<'ENDSSH'
#commands to run on remote host
ssh [email protected] <<'END2'
# Another bunch of commands on another host
wall <<'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.secureftp-test.com <<'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH

Sie können tatsächlich mit einigen Diensten wie telnet, ftp usw. telefonieren. Aber denken Sie daran, dass heredoc nur die stdin als Text sendet, es wartet nicht auf die Antwort zwischen den Zeilen

Edit: Ich habe gerade herausgefunden, dass Sie die Innenseiten einrücken können, wenn Sie <<-END !

ssh [email protected] <<-'ENDSSH'
    #commands to run on remote host
    ssh [email protected] <<-'END2'
        # Another bunch of commands on another host
        wall <<-'ENDWALL'
            Error: Out of cheese
        ENDWALL
        ftp ftp.secureftp-test.com <<-'ENDFTP'
            test
            test
            ls
        ENDFTP
    END2
ENDSSH

(Ich denke, das sollte funktionieren)

Siehe auch http://tldp.org/LDP/abs/html/here-docs.html


Dies ist eine Erweiterung von YarekT's Antwort zum Kombinieren von Inline-Remote-Befehlen mit Übergabe von ENV-Variablen vom lokalen Rechner an den Remote-Host, so dass Sie Ihre Skripte auf der Remote-Seite parametrisieren können:

ssh [email protected] ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'
  # commands to run on remote host
  echo $ARG1 $ARG2
ENDSSH

Ich fand das außergewöhnlich hilfreich, indem ich alles in einem Skript aufbewahre, damit es gut lesbar und wartbar ist.

Warum das funktioniert. ssh unterstützt die folgende Syntax:

ssh user @ host remote_command

In bash können wir Umgebungsvariablen angeben, die vor der Ausführung eines Befehls in einer einzelnen Zeile definiert werden:

ENV_VAR_1 = 'Wert1' ENV_VAR_2 = 'Wert2' Bash -c 'Echo $ ENV_VAR_1 $ ENV_VAR_2'

Das macht es einfach, Variablen vor dem Ausführen eines Befehls zu definieren. In diesem Fall ist echo unser Befehl, den wir ausführen. Alles vor echo definiert Umgebungsvariablen.

Also kombinieren wir diese beiden Funktionen und die Antwort von YarekT:

ssh Benutzer @ Host ARG1 = $ ARG1 ARG2 = $ ARG2 'Bash -s' << 'ENDSSH' ...

In diesem Fall setzen wir ARG1 und ARG2 auf lokale Werte. Senden Sie alles nach user @ host als remote_command. Wenn der Remote-Computer den Befehl ARG1 und ARG2 ausführt, werden die lokalen Werte dank der lokalen Befehlszeilenauswertung festgelegt, die Umgebungsvariablen auf dem Remote-Server definiert. Anschließend wird der Befehl bash -s mit diesen Variablen ausgeführt. Voila.


Ich habe begonnen, Fabric für anspruchsvollere Operationen zu verwenden. Fabric benötigt Python und einige andere Abhängigkeiten, aber nur auf dem Client-Rechner. Der Server muss nur ein SSH-Server sein. Ich finde, dass dieses Tool viel leistungsfähiger ist als Shell-Skripte, die an SSH übergeben werden, und es lohnt sich, sich einzurichten (vor allem, wenn Sie gerne in Python programmieren). Fabric-Handles, die Skripts auf mehreren Hosts (oder Hosts bestimmter Rollen) ausführen, erleichtern idempotente Operationen (z. B. das Hinzufügen einer Zeile zu einem Konfigurationsskript, aber nicht, wenn sie bereits vorhanden sind) und ermöglichen die Konstruktion komplexerer Logik (z. B. Python Sprache kann liefern).




<hostA_shell_prompt>$ ssh [email protected] "ls -la"

Dadurch werden Sie zur Eingabe eines Kennworts aufgefordert, es sei denn, Sie haben den öffentlichen Schlüssel des Benutzers hostA in die Datei authorized_keys im Verzeichnis des Benutzers .ssh kopiert. Dies ermöglicht eine passwortlose Authentifizierung (wenn sie als Authentifizierungsmethode in der Konfiguration des SSH-Servers akzeptiert wird)







remote-execution