PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Password Change über ssh an mehrere Server



SalverTere
05.04.12, 13:58
Tag,
ich hab ein kleines Problemchen und komm nicht wirklich weiter.
und zwar:
ich habe mehrere Linux Server die alle einem Sprungserver angebunden sind (auch linux).
Sobald der Passwortwechsel wieder ansteht darf ich halt auf jeden Server drauf und das Passwort ändern. Bei immer mehr Servern wird das nervig.

Mein Gedanke:
Skript starten auf dem Sprungserver - dies verbindet sich dann per ssh jeweils einzeln auf die Server. Macht dann dort ein passwd und vergibt ein neues Passwort:


#!/bin/sh
#for i in `more ~/userlist.txt `
#select i in `grep -i "HostName " .ssh/config | awk '{print $2}'`
#Liste in der alle Server hinterlegt sind
for i in `grep -i "HostName " .ssh/config | awk '{print $2}'`
do
echo $i
set -x
#verbinden auf den einzelnen Server:
ssh meinuser@$i -l meinuser 'passwd <<EOF
AltesPasswort
NeuesPasswort
NeuesPasswort
EOF';
done

oder so (hat aber auch nicht funktioniert:


#for i in `more ~/userlist.txt `
#select i in `grep -i "HostName " .ssh/config | awk '{print $2}'`
for i in `grep -i "HostName " .ssh/config | awk '{print $2}'`
do
echo $i
set -x
ssh meinuser @$i "passwd; AltesPasswort; echo NeuesPasswort; echo NeuesPasswort"
sleep 10
#echo NeuesPasswort| passwd meinuser
done


Jemand eine Idee?
Danke.

int 80h
05.04.12, 14:09
Für die "interaktive" Kommunikation mit passwd könnte expect helfen.

http://linux.die.net/man/1/expect

Freundliche Grüße,
int 80h

marce
05.04.12, 14:12
oder ändere es auf einem Server und ersetze auf den anderen nur den alten durch den neuen hash in der shadow...

Alternativ könnte man aber auch über eine zentrale PW-Verwaltung nachtenken - muss ja nicht gleich LDAP sein...

SalverTere
10.04.12, 16:41
Was interessantes gefunden: http://www.clug.de/vortraege/expect/expect.html


expect
Der Befehl expect erwartet eine bestimmte Ausgabe eines Prozesses. Dabei wird normalerweise ein Timeout von 10 Sekunden benutzt, was sich aber durch eine Zuweisung an die Variable timeout auch anders regeln läßt. Der Vergleich der Ausgabe mit dem Suchmuster kann dabei über einfaches "globbing", so wie in der Shell, über einen exakten Stringvergleich oder über reguläre Ausdrücke erfolgen. Ein Befehl expect kann mehrere Paare aus Suchmuster und Aktion erhalten. Ein Beispiel, daß aus einem Modem-Chat stammen könnte, soll das etwas verdeutlichen:

set timeout 70
expect {
"BUSY" retry
"NO *" abort
"CONNECT" go_on
}

send
Dieser Befehl ermöglich das Senden von Daten an den ferngesteuerten Prozeß, so, als würden diese vom Benutzer stammen. Damit haben wir bereits alles zusammen, um unser Passwort ohne lästige Nachfrage ändern zu können:

#!/usr/local/bin/expect
set oldpass [lindex $argv 0]
set newpass [lindex $argv 1]
spawn passwd
expect "Old password:" {send "$oldpass\r"}
expect "New password:" {send "$newpass\r"}
expect "Re-enter new password:" {send "$newpass\r"}
expect {
"Password changed." {puts stdout "\nPaßwort erfolgreich geändert"}
default {puts stdout "\nHat nicht funktioniert!"}
}

Man beachte, daß der Code für die Return-Taste (\r) mit angegeben werden muß, sonst betrachtet der Prozeß die Eingabe nicht als abgeschlossen. Außerdem kann man im Moment noch den Ablauf des Scripts am Bildschirm mitverfolgen. Will man das unterdrücken, so fügt man am Anfang den Befehl log_user 0 ein. In expectk, der Tk-Version von expect, muß man übrigens send durch exp_send ersetzen, da send schon ein Tk-Befehl ist (mit dem sich Befehle in einem anderen Tk-Interpreter auf der gleichen Maschine ausführen lassen).

Mal ausprobieren...

int 80h
10.04.12, 17:39
Das hatte ich doch vorgeschlagen. Erste Antwort im Thread. :ugly:

Freundliche Grüße,
int 80h

SalverTere
10.04.12, 17:41
Ja genau - danke!
ich wollts nur noch mal für die Nachwelt reinschreiben...

SalverTere
11.04.12, 15:38
also es funktioniert - aber nicht so wie ich es wollte.
Auf meiner "testumgebung" haut es hin - aber der richtige Sprungserver unterstützt kein expect und installieren kann ich es auch nicht.
Schade... Danke für die Hilfe!