it-swarm.com.de

Skript zum Ändern des Kennworts auf Linux-Servern über ssh

Wir haben eine Reihe von Red Hat Linux-Servern in unserer IT-Umgebung. Ich werde von meinen Teammitgliedern gebeten, ein Skript (vorzugsweise ein Shell-Skript) zu schreiben, um das Kennwort eines Benutzers für jeden Benutzer in einem Durchgang mithilfe von SSH zu ändern.

Ich habe versucht, eine Lösung zu finden, aber viele der gefundenen Skripts verwenden Expect. Wir haben Expect nicht auf unseren Servern installiert und die Systemadministratoren haben uns die Installation verweigert. Außerdem haben die Benutzer keinen Root-Zugriff, sodass passwd --stdin oder chpasswd nicht verwendet werden können.

Gibt es eine Möglichkeit, ein Skript zu schreiben, so dass ein Benutzer es ausführen und das Kennwort nur seines eigenen Benutzers auf allen Servern in einer Liste ändern kann?

19
squashbuff

Die Remote-Computer müssen nicht installiert sein. Sie können Expect auf einer lokalen Arbeitsstation oder VM (Virtualbox) oder einer beliebigen * nix-Box installieren und einen Wrapper schreiben, der dieses .ex (Expect) -Skript aufruft (möglicherweise gibt es kleine Änderungen von Distro zu Distro, auf die dies getestet wurde CentOS 5/6):

#!/usr/bin/expect -f
# wrapper to make passwd(1) be non-interactive
# username is passed as 1st arg, passwd as 2nd

set username [lindex $argv 0]
set password [lindex $argv 1]
set serverid [lindex $argv 2]
set newpassword [lindex $argv 3]

spawn ssh $serverid passwd
expect "assword:"
send "$password\r"
expect "UNIX password:"
send "$password\r"
expect "password:"
send "$newpassword\r"
expect "password:"
send "$newpassword\r"
expect eof
19
Randy Katz

Sie benötigen keinen Root-Zugriff, um passwd zu verwenden.

Das sollte gut funktionieren.

passwd <<EOF
old password
new password
new password
EOF
12
Dennis

Du solltest pssh (parallele ssh zur gleichen Zeit) versuchen.

cat>~/ssh-hosts<<EOF
[email protected]
[email protected]
[email protected]
EOF

pssh -h ~/pssh-hosts 'printf "%s\n" old_pass new_pass new_pass | passwd'
10
Gilles Quenot

Aufbauend auf Squashbuffs Beispiel versuchte ich Folgendes, was für mich gut funktionierte:

#!/bin/bash 
 für Server in `cat hostlist`; do 
 echo $ server; 
 ssh username @ $ server 'passwd & ltEOF 
 altesKennwort 
 neues_kennwort 
 neues_kennwort 
 EOF'; 
 done

In Bezug auf die Sicherheit könnte die Eingabe verbessert werden, ohne dass ein Echo auf dem Bildschirm OR erfolgt, der den Klartext auf der Festplatte speichert.

6
fsckin
echo "name:password" | chpasswd
4
Poma

Eine andere Möglichkeit: Manuelles Ändern auf einem Server. Holen Sie das verschlüsselte Passwort aus/etc/shadow. Nun mache so etwas:

for Host in $Host_LIST; do
    ssh $Host "passwd -p 'encrypted_passwd' user"
done

Natürlich ist 'encrypted_passwd' das, was Sie aus/etc/shadow herausbekommen haben, wo Sie das Passwort manuell geändert haben. Und $ Host_LIST ist eine Liste von Hosts, bei denen das Passwort geändert werden soll.

export Host_LIST="server1 server2 server15 server67"

Oder vielleicht mit einer Datei (wie andere vorgeschlagen haben):

export Host_LIST=`cat Host_list.txt`

Die Datei "Host_list.txt" enthält eine Liste aller Systeme, bei denen das Kennwort geändert werden soll.

Edit: Falls Ihre Version von passwd die Option -p nicht unterstützt, ist möglicherweise das Programm 'usermod' verfügbar. Das obige Beispiel bleibt dasselbe, ersetzen Sie einfach 'passwd' durch 'usermod'.

Darüber hinaus können Sie das nützliche Tool pdsh in Betracht ziehen, das das obige Beispiel in etwa wie folgt vereinfachen würde:

echo $Host_LIST | pdsh -Rssh -w- "usermod -p 'encrypted_passwd' user"

Eine letzte "Suche nach": Das verschlüsselte Passwort enthält wahrscheinlich das Dollarzeichen ('$') als Feldtrennzeichen. Sie müssen wahrscheinlich die in Ihrem for-Loop- oder pdsh-Befehl enthaltenen Escapezeichen (d. H. "$" Wird zu "\ $").

3
Matt
  1. Installieren Sie sshpass auf einem Server, auf dem Sie das Skript ausführen möchten.

    yum -y install sshpass
    
  2. Bereiten Sie eine Textdatei vor, in der Sie Details wie Host, Benutzername, Kennwort und Port übergeben müssen. (Basierend auf Ihrer Anforderung).

    192.168.1.2|sachin|dddddd|22
    
  3. Bereiten Sie eine Skriptdatei mit den folgenden Angaben vor.

    #!/bin/bash
    
    FILE=/tmp/ipaddress.txt
    
    MyServer=""
    MyUser=""
    MyPassword=""
    MyPort=""
    
    exec 3<&0
    exec 0<$FILE
    
    while read line
    do
        MyServer=$(echo $line | cut -d'|' -f1)
        MyUser=$(echo $line | cut -d'|' -f2)
        MyPassword=$(echo $line | cut -d'|' -f3)
        MyPort=$(echo $line | cut -d'|' -f4)
    
        Host=$MyServer
        USR=$MyUser
        PASS=$MyPassword
    
        sshpass -p $PASS ssh -p $MyPort -o StrictHostKeychecking=no [email protected]$Host \
                -T "echo '[email protected]' | passwd --stdin root"                 \
                < /dev/null | tee -a output.log
    done
    
    exec 0<&3
    
2
Sachin Patel

Kannst du Perl benutzen?

Hier Es gibt ein Skript, das das Passwort in einer Reihe von Hosts ändert.

Wenn einige Perl-Module ( Net :: OpenSSH :: Parallel , Expect und ihre Abhängigkeiten) auf dem lokalen Computer installiert sind, auf dem das Skript ausgeführt wird, auf den Remote-Servern jedoch nichts, wo das Kennwort geändert werden muss.

1
salva

Eine Alternative, die Sie Ihren Kollegen vorstellen möchten, wäre die Verwendung der kennwortlosen Authentifizierung. Sie generieren ein öffentliches/privates Schlüsselpaar und registrieren ihren öffentlichen Schlüssel in der Datei ~/.ssh/authorised_keys auf jedem der Server, auf denen sie sich anmelden.

1
phatfingers

Das mit Expect gelieferte passmass script ( man page ) erfordert nicht, dass Expect auf den Remote-Computern installiert ist.

1

Haben Sie versucht, App :: Unix :: RPasswd

1
Kris

echo -e "wakka2\nwakka2\n" | passwd root

0
Lance Badger
cat /tmp/passwords | ssh $server Sudo chpasswd -e

wenn das Passwort verschlüsselt ist oder

cat /tmp/passwords | ssh $server Sudo chpasswd

wenn das Passwort nicht verschlüsselt ist.

/ tmp/passwords sollte das Format "Benutzer: Passwort" haben

0
Tom Mullahey

Ich dachte, ich sollte meine Lösung in ein Antwortfeld setzen - nicht sicher, ob dies ein Teil der Frage sein sollte.

OK, ich habe mit Dennis 'Vorschlag eine teilweise funktionierende Lösung zusammengestellt.

servers.txt sieht so aus:

server1
server2
server3
.
.
.

Ich benutze:

for server in `cat servers.txt`; do
ssh $server -l user 'passwd <<EOF
old_pass
new_pass
new_pass
EOF';
done

Dies erzeugt:

[email protected]'s password: **<Type password manually>**
(current) UNIX password: New UNIX password: Retype new UNIX password: Changing password for user user.
Changing password for user
passwd: all authentication tokens updated successfully.
[email protected]'s password: **<Type password manually>**
(current) UNIX password: New UNIX password: Retype new UNIX password: Changing password for user user.
Changing password for user
passwd: all authentication tokens updated successfully.

Hier muss ich also noch einmal für jeden Server mein altes Passwort eingeben. Kann das vermieden werden?

0
squashbuff

Wenn Sie ssh haben, warum haben Sie überhaupt Passwörter? Geben Sie den öffentlichen ssh-Schlüssel des Benutzers an alle Server weiter, zu deren Verwendung er berechtigt ist. Auf diese Weise können Sie den Zugriff auch ganz einfach gewähren und widerrufen.

Bei einem früheren $ dayjob, bei dem wir buchstäblich Zehntausende von Servern hatten, hatten sie eine Datenbank, auf der Ingenieure auf welchen Servern erlaubt waren, und die Installation von SSH-Schlüsseln war ein automatisierter Prozess. Fast niemand hatte ein Passwort auf einem beliebigen Rechner.

0
Edward Falk