Ich muss ein Shell-Skript (Windows / Linux) auf einem Remote-Computer ausführen.
Ich habe SSH auf Computer A und B konfiguriert. Mein Skript befindet sich auf Computer A, auf dem ein Teil meines Codes auf einem Remotecomputer, Computer B, ausgeführt 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?
shell
ssh
sysadmin
remote-execution
alpha_989
quelle
quelle
Antworten:
Wenn Maschine A eine Windows-Box ist, können Sie Plink (Teil von PuTTY ) mit dem Parameter -m verwenden und das lokale Skript auf dem Remote-Server ausführen.
Wenn Maschine A ein Unix-basiertes System ist, können Sie Folgendes verwenden:
Sie sollten das Skript nicht auf den Remote-Server kopieren müssen, um es auszuführen.
quelle
-s
Option? Diese Manpage lässt mich glauben, dass sie Standardeingaben verarbeitet, wenn die Verarbeitungsoptionen fertig sind, unabhängig davon, ob sie-s
verwendet werden oder nicht.sudo
Führen Sie für ein Skript aus, das dies erfordertssh root@MachineB 'echo "rootpass" | sudo -Sv && bash -s' < local_script.sh
.HISTCONTROL=ignoreboth or ignorespace
, damit es funktioniert)ssh root@MachineB ARG1="arg1" ARG2="arg2" 'bash -s' < local_script.sh
Credits gehen vollständig zur Antwort von @chubbsondubs unten.Dies ist eine alte Frage, und Jasons Antwort funktioniert gut, aber ich möchte Folgendes hinzufügen:
Dies kann auch mit su und Befehlen verwendet werden, für die Benutzereingaben erforderlich sind. (Beachten Sie den
'
entkommenen Heredoc)Bearbeiten: Da diese Antwort immer wieder Verkehr bekommt, würde ich dieser wunderbaren Verwendung von Heredoc noch mehr Informationen hinzufügen:
Sie können Befehle mit dieser Syntax verschachteln, und nur so scheint das Verschachteln zu funktionieren (auf vernünftige Weise).
Sie können tatsächlich ein Gespräch mit einigen Diensten wie Telnet, FTP usw. führen. Denken Sie jedoch daran, dass heredoc das stdin nur als Text sendet und nicht auf eine Antwort zwischen den Zeilen wartet
Bearbeiten: Ich habe gerade herausgefunden, dass Sie die Innenseiten mit Tabulatoren einrücken können, wenn Sie verwenden
<<-END
!(Ich denke das sollte funktionieren)
Siehe auch http://tldp.org/LDP/abs/html/here-docs.html
quelle
<<'ENDSSH'
) die Zeichenfolgen nicht erweitert und Variablen nicht ausgewertet werden. Sie können auch verwenden<<ENDSSH
oder<<"ENDSSH"
wenn Sie eine Erweiterung wünschen.Expect
kann verwendet werden, wenn Sie interaktive Befehle wie FTP automatisieren müssen.Pseudo-terminal will not be allocated because stdin is not a terminal.
Nachricht hatte. Man muss ssh mit-t -t
params verwenden, um das zu vermeiden. Siehe diesen Thread auf SOVergessen Sie auch nicht, Variablen zu maskieren, wenn Sie sie vom Zielhost abholen möchten.
Das hat mich in der Vergangenheit erwischt.
Zum Beispiel:
druckt / home / user2 aus
während
druckt / home / user aus
Ein anderes Beispiel:
druckt "Hallo" richtig aus.
quelle
ssh user2@host 'bash -s' echo $HOME /home/user2 exit
for
Schleifen, die in einerssh
Sitzung ausgeführt werden, die Schleifenvariable nicht maskiert werden darf.ssh user2@host2 'echo hello world' | awk '{ print $1 }'
das Awk-Skript lokal auszuführen. Wenn der Remote-Befehl eine immense Ausgabe erzeugt, möchten Sie natürlich vermeiden, alles auf den lokalen Server zurück zu kopieren. Im Übrigen vermeiden einfache Anführungszeichen um den Remote-Befehl, dass ein Escapezeichen erforderlich ist.Dies ist eine Erweiterung der Antwort von YarekT, Inline-Remote-Befehle mit der Übergabe von ENV-Variablen vom lokalen Computer an den Remote-Host zu kombinieren, damit Sie Ihre Skripte auf der Remote-Seite parametrisieren können:
Ich fand das außerordentlich hilfreich, indem ich alles in einem Skript aufbewahrte, damit es sehr gut lesbar und wartbar ist.
Warum das so ist. ssh unterstützt die folgende Syntax:
In bash können wir Umgebungsvariablen angeben, die definiert werden sollen, bevor ein Befehl in einer einzelnen Zeile ausgeführt wird:
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 dem Echo definiert Umgebungsvariablen.
Also kombinieren wir diese beiden Funktionen und die Antwort von YarekT, um Folgendes zu erhalten:
In diesem Fall setzen wir ARG1 und ARG2 auf lokale Werte. Senden Sie alles nach user @ host als remote_command. Wenn der Remotecomputer den Befehl ARG1 und ARG2 ausführt, werden die lokalen Werte dank der lokalen Befehlszeilenauswertung festgelegt, die Umgebungsvariablen auf dem Remoteserver definiert, und führt dann den Befehl bash -s unter Verwendung dieser Variablen aus. Voila.
quelle
ssh user@host "ARG1=\"$ARG1\" ARG2=\"$ARG2\"" 'bash -s' <<'ENDSSH'...
-s
darin, Argumente auf Skripte anwenden zu können, die über stdin bezogen werden. Ich meine, Sie können es auch weglassen, wenn Sie es nicht verwenden. Wenn Sie es verwenden, gibt es keinen Grund, Umgebungsvariablen zu verwenden:ssh user@host 'bash -s value1 value2' <<< 'echo "$@"'
Daraufhin werden Sie zur Eingabe des Kennworts aufgefordert, es sei denn, Sie haben den öffentlichen Schlüssel Ihres hostA-Benutzers in die Datei authorized_keys im Verzeichnis des Benutzers .ssh kopiert. Dies ermöglicht eine kennwortlose Authentifizierung (sofern dies in der Konfiguration des SSH-Servers als Authentifizierungsmethode akzeptiert wird).
quelle
Ich habe angefangen, Fabric für anspruchsvollere Operationen zu verwenden. Fabric erfordert Python und einige andere Abhängigkeiten, jedoch nur auf dem Client-Computer. Der Server muss nur ein SSH-Server sein. Ich finde, dass dieses Tool viel leistungsfähiger ist als an SSH übergebene Shell-Skripte und die Mühe wert ist, eingerichtet zu werden (insbesondere, wenn Sie gerne in Python programmieren). Fabric verwaltet das Ausführen von Skripten auf mehreren Hosts (oder Hosts bestimmter Rollen), erleichtert idempotente Vorgänge (z. B. das Hinzufügen einer Zeile zu einem Konfigurationsskript, jedoch nicht, wenn es bereits vorhanden ist) und ermöglicht die Erstellung komplexerer Logik (z. B. Python) Sprache kann bieten).
quelle
Versuche zu rennen
ssh user@remote sh ./script.unx
.quelle
quelle
Angenommen, Sie möchten dies automatisch von einem "lokalen" Computer aus tun, ohne sich manuell bei dem "Remote" -Computer anzumelden, sollten Sie sich eine TCL-Erweiterung ansehen, die als "Expect" bezeichnet wird. Sie ist genau für diese Art von Situation konzipiert. Ich habe auch einen Link zu einem Skript zum Anmelden / Interagieren über SSH bereitgestellt.
https://www.nist.gov/services-resources/software/expect
http://bash.cyberciti.biz/security/expect-ssh-login-script/
quelle
Ich verwende dieses, um ein Shell-Skript auf einem Remote-Computer auszuführen (getestet auf / bin / bash):
quelle
Es wird dringend empfohlen, die Umgebungsdatei (.bashrc / .bashprofile / .profile) als Quelle zu verwenden. bevor Sie etwas auf einem Remote-Host ausführen, da Umgebungsvariablen für Ziel- und Quellhosts möglicherweise verzögert sind.
quelle
Wenn Sie einen Befehl wie diesen ausführen möchten
temp=`ls -a` echo $temp
in `` möchten, werden Fehler verursacht.Der folgende Befehl löst dieses Problem
ssh user@host ''' temp=`ls -a` echo $temp '''
quelle
Die Antwort hier ( https://stackoverflow.com/a/2732991/4752883 ) funktioniert hervorragend, wenn Sie versuchen, ein Skript auf einem Remote-Linux-Computer mit
plink
oder auszuführenssh
. Es funktioniert, wenn das Skript mehrere Zeilen enthältlinux
.** Wenn Sie jedoch versuchen, ein Batch-Skript auszuführen, das sich auf einem lokalen
linux/windows
Computer und auf Ihrem Remotecomputer befindetWindows
, besteht es aus mehreren Zeilen mit **plink root@MachineB -m local_script.bat
wird nicht funktionieren.
Es wird nur die erste Zeile des Skripts ausgeführt. Dies ist wahrscheinlich eine Einschränkung von
plink
.Lösung 1:
So führen Sie ein mehrzeiliges Batch-Skript aus (insbesondere wenn es relativ einfach ist und aus wenigen Zeilen besteht):
Wenn Ihr ursprüngliches Batch-Skript wie folgt lautet
Sie können die Zeilen mithilfe des Trennzeichens "&&" wie folgt in Ihrer
local_script.bat
Datei kombinieren : https://stackoverflow.com/a/8055390/4752883 :Nach dieser Änderung können Sie das Skript wie hier von @ JasonR.Coombs beschrieben ausführen: https://stackoverflow.com/a/2732991/4752883 mit:
Lösung 2:
Wenn Ihr Batch-Skript relativ kompliziert ist, ist es möglicherweise besser, ein Batch-Skript zu verwenden, das den Befehl plink sowie die folgenden Anweisungen enthält : @Martin https://stackoverflow.com/a/32196999/4752883 :
quelle
Dieses Bash-Skript führt SSH auf einem Remote-Zielcomputer aus und führt einen Befehl auf dem Remotecomputer aus. Vergessen Sie nicht, Expect zu installieren, bevor Sie es ausführen (auf einem Mac
brew install expect
).quelle
Sie können runoverssh verwenden :
-s
führt ein lokales Skript remote ausNützliche Flags:
-g
Verwenden Sie ein globales Kennwort für alle Hosts (Eingabeaufforderung mit einem Kennwort).-n
Verwenden Sie SSH anstelle von sshpass, was für die Authentifizierung mit öffentlichem Schlüssel nützlich istquelle
Kopieren Sie zunächst das Skript mit scp auf Maschine B.
Führen Sie dann einfach das Skript aus
Dies funktioniert, wenn Sie dem Skript ausführbare Berechtigungen erteilt haben.
quelle