Frage

mein Problem ist wie folgt:Ich schreibe ein Skript, dessen Zweck es ist, bestimmte Skripte parallel auf verschiedenen Servern auszuführen.Dh ich möchte mich bei einem Remote-Server anmelden, das Passwort eingeben (dies ist nicht verhandelbar, weil Chef), das Skript starten, die Verbindung schließen, während das Skript noch läuft, eine Verbindung zum nächsten Server herstellen und den ganzen Tanz erneut ausführen.Wie mache ich das?

War es hilfreich?

Lösung

Angenommen, bash ist die Ziel-Shell auf allen Remote-Computern, könnten Sie dies für einen Computer tun:

ssh user@host /path/to/script '&>/dev/null' '</dev/null' '&' disown

Für mehrere Maschinen könnten Sie dies dann wie folgt skripten:

hosts='user1@host1 user2@host2'

for host in $hosts
do
  ssh $host /path/to/script '&>/dev/null' '</dev/null' '&' disown
done

Dies sollte nur dazu führen, dass Sie Passwörter eingeben.

Alternativ, wenn Sie dasselbe Passwort für mehrere Computer verwenden können, würde ich empfehlen, nach zu suchen ClusterSSH.Damit können Sie sich gleichzeitig bei mehreren Computern anmelden und Befehle eingeben, die an alle in einem einzigen Fenster oder einzeln in jedem xterm-Fenster gesendet werden sollen.Dies würde Ihnen ersparen, dasselbe Passwort wiederholt einzugeben.Sobald Sie angemeldet sind, können Sie den Befehl wie oben ausgeführt (ohne die ssh user@host teil) und beenden.

Update

Ein paar zusätzliche Gedanken hier.Erstens ist es wahrscheinlich keine gute Idee, die Skriptausgabe vollständig zu verwerfen, da Sie nie wissen werden, was passiert ist, wenn etwas schief gelaufen ist.Sie können es einfach in eine Datei einfügen, um es später anzusehen, indem Sie es ersetzen '&>/dev/null' mit '&>filename'.Ein anderer Ansatz wäre, den Remote-Computer per E-Mail an Sie senden zu lassen (vorausgesetzt, er ist dafür richtig eingerichtet):

host=user@host
ssh $host \(/path/to/script '2>&1' \| mail -s "$host output" me@me.com\) \
  '&>/dev/null' '</dev/null' '&' disown

Zweitens, wenn sich das Skript auf dem lokalen Host befindet, können Sie es kopieren und in einem Befehl ausführen.Nimmt ein Shell-Skript an, wenn nicht nur ersetzen sh mit dem richtigen Dolmetscher)

</path/to/script ssh user@host \
  cat \>script \; sh ./script '&>/dev/null' '</dev/null' '&' disown

Andere Tipps

Nach dem Anmelden können Sie das Bildschirmdienstprogramm verwenden, um eine neue Terminalsitzung zu starten und später davon zu trennen, Beispiel:

[user@local]$ ssh machine
[user@machine]$ screen -S my_session
# you are now switched to new terminal session named "my_session"
# now you can start long operation, that you want to keep in background
[user@machine]$ yes
# press "Ctrl-a d" to detach, you will go back to original session
[detached from 11271.my_session]
# now you can leave ssh (your session with "yes" running will be kept in background)
# to list existing screen sessions run:
[user@machine]$ screen -list
There is a screen on:
11271.my_session    (Detached)
1 Socket in /var/run/screen/S-user.
# to re-attach use -r
[user@machine]$ screen -r my_session
# you will be back to session with "yes" still running (press Ctrl-C to stop it)

Sobald Sie verstanden haben, wie der Bildschirm funktioniert, können Sie versuchen, ihn per Skript zu erstellen;so starten Sie die Bildschirmsitzung im getrennten Zustand, in dem my_command ausgeführt wird:

$ screen -d -m my_command

expect kann das ziemlich einfach automatisieren:

#!/usr/bin/expect -f

set hosts {your list of hosts goes here ...}
foreach host $hosts {
    spawn ssh -t user@$host screen ./script.sh
    expect "assword:"
    send -- "secret\r"
    sleep 1
    send -- "d"
    expect eof
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top