it-swarm.com.de

Schreiben Sie ein Shell-Skript, um ssh auf eine entfernte Maschine zu senden und Befehle auszuführen

Ich habe zwei Fragen:

  1. Es gibt mehrere entfernte Linux-Rechner, und ich muss ein Shell-Skript schreiben, das auf jedem Rechner den gleichen Befehlssatz ausführt. (Einschließlich einiger Sudo-Operationen). Wie kann dies mithilfe von Shell-Skripten geschehen?
  2. Wie wird beim Senden an den Remote-Computer vorgegangen, wenn zur Authentifizierung per RSA-Fingerabdruck aufgefordert wird?.

Die Remotecomputer sind VMs, die während der Ausführung erstellt werden, und ich habe nur ihre IPs. Daher kann ich auf diesen Computern keine Skriptdatei ablegen und sie von meinem Computer aus ausführen.

82
Balanivash

Es gibt mehrere entfernte Linux-Rechner, und ich muss ein Shell-Skript schreiben, das auf jedem Rechner den gleichen Befehlssatz ausführt. (Einschließlich einiger Sudo-Operationen). Wie kann dies mithilfe von Shell-Skripten geschehen?

Sie können dies mit ssh tun, zum Beispiel:

#!/bin/bash
USERNAME=someUser
HOSTS="Host1 Host2 Host3"
SCRIPT="pwd; ls"
for HOSTNAME in ${HOSTS} ; do
    ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}"
done

Wie wird beim Senden an den Remote-Computer vorgegangen, wenn zur Authentifizierung per RSA-Fingerabdruck aufgefordert wird?.

Sie können die Option StrictHostKeyChecking=no Zu ssh hinzufügen:

ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls"

Dadurch wird Deaktivieren der Hostschlüsselprüfung und der Hostschlüssel automatisch zur Liste der bekannten Hosts hinzugefügt. Wenn Sie nicht möchten, dass der Host der bekannten Hosts-Datei hinzugefügt wird, fügen Sie die Option -o UserKnownHostsFile=/dev/null Hinzu.

Beachten Sie, dass dies bestimmte Sicherheitsüberprüfungen deaktiviert, beispielsweise den Schutz vor Man-in-the-Middle-Angriffen. Es sollte daher nicht in einer sicherheitsrelevanten Umgebung angewendet werden.

123
Andreas Fester

Es gibt verschiedene Möglichkeiten, damit umzugehen.

Am liebsten installiere ich http://pamsshagentauth.sourceforge.net/ auf den Remote-Systemen und auch auf Ihrem eigenen öffentlichen Schlüssel. (Finde heraus, wie du diese auf der VM installieren kannst. Irgendwie hast du ein gesamtes Unix-System installiert. Was sind noch ein paar Dateien?)

Wenn Sie Ihren ssh-Agenten weitergeleitet haben, 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 Rechten eines anderen Benutzers) ausgeführt werden können.

Sie müssen sich keine Sorgen um die Host-Schlüsselinteraktion 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 ansehen wie Capistrano. Schauen Sie sich auf jeden Fall auf dieser Site um; Es enthält eine Einführung in das Remote-Scripting.

Einzelne Skriptzeilen könnten ungefähr so ​​aussehen:

ssh remote-system-name command arguments ... # so, for exmaple,
ssh target.mycorp.net Sudo puppet apply
4
DigitalRoss

Installiere sshpass mit, apt-get install sshpass bearbeite dann das Skript und gib die IPs, Benutzernamen und das Passwort deines Linux-Computers in die entsprechende Reihenfolge ein. Führen Sie danach das Skript aus. Das ist es ! Dieses Skript installiert VLC auf allen Systemen.

#!/bin/bash
SCRIPT="cd Desktop; pwd;  echo -e 'PASSWORD' | Sudo -S apt-get install vlc"
HOSTS=("192.168.1.121" "192.168.1.122" "192.168.1.123")
USERNAMES=("username1" "username2" "username3")
PASSWORDS=("password1" "password2" "password3")
for i in ${!HOSTS[*]} ; do
     echo ${HOSTS[i]}
     SCR=${SCRIPT/PASSWORD/${PASSWORDS[i]}}
     sshpass -p ${PASSWORDS[i]} ssh -l ${USERNAMES[i]} ${HOSTS[i]} "${SCR}"
done
4

Wenn Sie in der Lage sind, Perl-Code zu schreiben, sollten Sie die Verwendung von Net :: OpenSSH :: Parallel in Betracht ziehen.

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 über Sudo wird ebenfalls unterstützt.

2
salva

Für diese Art von Aufgaben verwende ich wiederholt Ansible , um zusammenhängende Bash-Skripte in mehreren Containets oder VMs zu duplizieren. Ansible (genauer gesagt Red Hat) hat jetzt ein zusätzliches Webinterface [~ # ~] awx [~ # ~] , die die Open-Source-Ausgabe ihres kommerziellen Turms ist.

Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible Tower: Als kommerzielles Produkt werden Sie wahrscheinlich zuerst den kostenlosen Open-Source-AWX und nicht den 15-tägigen Free-Trail von Tower erkunden

0
Fibo

Diese Arbeit für mich.

Syntax: ssh -i pemfile.pem benutzername @ ip_adresse 'befehl_1; befehl 2; befehl 3'

#! /bin/bash

echo "########### connecting to server and run commands in sequence ###########"
ssh -i ~/.ssh/ec2_instance.pem [email protected]_address 'touch a.txt; touch b.txt; Sudo systemctl status Tomcat.service'
0
Viraj.Hadoop