Ich habe zwei Fragen:
- Es gibt mehrere Remote-Linux-Computer, und ich muss ein Shell-Skript schreiben, das auf jedem Computer denselben Befehlssatz ausführt. (Einschließlich einiger Sudo-Operationen). Wie kann dies mithilfe von Shell-Skripten erreicht werden?
- Wie geht man vor, wenn man zur Remote-Computer-Authentifizierung auffordert?
Die Remote-Computer sind VMs, die während des Laufs erstellt wurden, und ich habe nur ihre IPs. Daher kann ich keine Skriptdatei im Voraus auf diesen Computern ablegen und sie von meinem Computer aus ausführen.
expect
wie folgt behandelt werden: " erwarten" ? assword: "Antworten:
Sie können dies mit ssh tun, zum Beispiel:
Sie können die
StrictHostKeyChecking=no
Option zu ssh hinzufügen :Dadurch wird die Hostschlüsselprüfung deaktiviert und der Hostschlüssel automatisch zur Liste der bekannten Hosts hinzugefügt. Wenn Sie nicht möchten, dass der Host zur bekannten Hosts-Datei hinzugefügt wird, fügen Sie die Option hinzu
-o UserKnownHostsFile=/dev/null
.Beachten Sie, dass dadurch bestimmte Sicherheitsüberprüfungen deaktiviert werden , z. B. der Schutz vor Man-in-the-Middle-Angriffen. Es sollte daher nicht in einer sicherheitsrelevanten Umgebung angewendet werden.
quelle
ssh
von jedem Shell-Skript aus anrufenEs gibt verschiedene Möglichkeiten, damit umzugehen.
Am liebsten installiere ich http://pamsshagentauth.sourceforge.net/ auf den Remote-Systemen und auch Ihren eigenen öffentlichen Schlüssel. (Finden Sie heraus, wie Sie diese auf der VM installieren können. Irgendwie haben Sie ein ganzes Unix-System installiert. Was sind noch ein paar Dateien?)
Wenn Ihr SSH-Agent weitergeleitet wird, können Sie sich jetzt ohne Kennwort bei jedem System anmelden.
Und noch besser, dieses Pam-Modul authentifiziert sich für Sudo mit Ihrem SSH-Schlüsselpaar, sodass Sie bei Bedarf mit Root-Rechten (oder den Rechten anderer Benutzer) ausgeführt werden können.
Sie müssen sich keine Gedanken über die Interaktion mit dem Hostschlüssel machen. Wenn es sich bei der Eingabe nicht um ein Terminal handelt, schränkt ssh lediglich Ihre Fähigkeit ein, Agenten weiterzuleiten und sich mit Kennwörtern zu authentifizieren.
Sie sollten sich auch Pakete wie Capistrano ansehen . Schauen Sie sich auf jeden Fall auf dieser Seite um. Es enthält eine Einführung in Remote-Scripting.
Einzelne Skriptzeilen könnten ungefähr so aussehen:
quelle
Installieren Sie sshpass mit,
apt-get install sshpass
bearbeiten Sie das Skript und ordnen Sie die IP-Adressen , Benutzernamen und das Kennwort Ihres Linux-Computers in der entsprechenden Reihenfolge. Führen Sie danach das Skript aus. Das ist es ! Dieses Skript installiert VLC auf allen Systemen.quelle
Wenn Sie Perl-Code schreiben können, sollten Sie Net :: OpenSSH :: Parallel verwenden .
Sie können die Aktionen, die auf jedem Host ausgeführt werden müssen, deklarativ beschreiben, und das Modul kümmert sich um alle beängstigenden Details. Das Ausführen von Befehlen
sudo
wird ebenfalls unterstützt.quelle
Diese Arbeit für mich.
Syntax: ssh -i pemfile.pem Benutzername @ IP-Adresse 'Befehl_1; Befehl 2; Befehl 3 '
quelle
Für diese Art von Aufgaben verwende ich wiederholt Ansible , mit dem kohärente Bash-Skripte in mehreren Containets oder VMs dupliziert werden können. Ansible (genauer gesagt Red Hat ) hat jetzt ein zusätzliches Webinterface AWX, das die Open-Source-Edition ihres kommerziellen Tower ist.
Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible Tower: kommerzielles Produkt, Sie werden wahrscheinlich zuerst den kostenlosen Open-Source-AWX erkunden, anstatt den 15-tägigen Free-Trail des Turms
quelle
Es gibt mehrere Möglichkeiten, die Befehle oder das Skript auf mehreren Remote-Linux-Computern auszuführen. Ein einfacher und einfacher Weg ist über pssh (paralleles SSH-Programm).
Pssh : ist ein Programm zum parallelen Ausführen von SSH auf einer Reihe von Hosts. Es bietet Funktionen wie das Senden von Eingaben an alle Prozesse, das Übergeben eines Kennworts an ssh, das Speichern der Ausgabe in Dateien und das Zeitlimit.
Beispiel & Verwendung:
Stellen Sie eine Verbindung zu Host1 und Host2 her und drucken Sie "Hallo, Welt" von jedem:
Führen Sie Befehle über ein Skript auf mehreren Servern aus:
Verwenden und Ausführen eines Befehls ohne Überprüfen oder Speichern von Hostschlüsseln:
Wenn die Datei hosts.txt eine große Anzahl von Einträgen enthält, z. B. 100, kann die Parallelitätsoption auch auf 100 gesetzt werden, um sicherzustellen, dass die Befehle gleichzeitig ausgeführt werden:
Optionen :
-I: Eingabe lesen und an jeden SSH-Prozess senden.
-P: Weist pssh an, die Ausgabe beim Eintreffen anzuzeigen.
-h: Liest die Datei des Hosts.
-H: [user @] host [: port] für Single-Host.
-i: Standardausgabe und Standardfehler anzeigen, wenn jeder Host abgeschlossen ist
-x Argumente : Übergibt zusätzliche SSH-Befehlszeilenargumente
-o Option: Kann verwendet werden, um Optionen in dem in der Konfigurationsdatei verwendeten Format anzugeben. (/ etc / ssh / ssh_config ) (~ / .ssh / config)
-p Parallelität: Verwenden Sie die angegebene Anzahl als maximale Anzahl gleichzeitiger Verbindungen.
-q Leiser Modus: Bewirkt, dass die meisten Warn- und Diagnosemeldungen unterdrückt werden.
-t: Zeitüberschreitung bei Verbindungen nach der angegebenen Anzahl von Sekunden. 0 bedeutet, dass pssh keine Zeitüberschreitung für Verbindungen verursacht
Deaktivieren Sie StrictHostKeyChecking, um die RSA-Authentifizierungsaufforderung zu verarbeiten.
-o StrictHostKeyChecking = no
Quelle : man pssh
quelle
Das hat bei mir funktioniert. Ich habe eine Funktion gemacht. Fügen Sie dies in Ihr Shell-Skript ein:
Wenn Sie mehrere Computer haben, auf denen Sie denselben Befehl ausführen möchten, wiederholen Sie diese Zeile mit einem Semikolon. Wenn Sie beispielsweise zwei Maschinen haben, würden Sie dies tun:
Ersetzen Sie USER durch den Benutzer des Computers. Ersetzen Sie HOST durch den Namen des Computers. Ersetzen Sie COMMAND durch den Befehl, den Sie auf dem Computer ausführen möchten.
Hoffe das hilft!
quelle
Sie können diesem Ansatz folgen:
quelle