Script pour changer le mot de passe sur les serveurs linux sur ssh

nous avons un certain nombre de serveurs linux Red Hat dans notre environnement informatique. Les membres de mon équipe me demandent d'écrire un script (de préférence un script shell) pour changer le mot de passe d'un utilisateur sur chacun de ceux-ci en une seule fois, en utilisant SSH.

j'ai essayé de trouver une solution mais beaucoup de scripts que j'ai trouvé utilisent Expect. Nous n'avons pas s'Attendre installé sur nos serveurs et les administrateurs système ont refusé de nous laisser nous installer. En outre, les utilisateurs n'ont pas d'accès root donc passwd --stdin ou chpasswd ne peuvent pas être utilisés.

y a-t-il un moyen d'écrire un script pour qu'un utilisateur puisse l'exécuter et changer le mot de passe de son propre utilisateur sur tous les serveurs d'une liste?

19
demandé sur Cristian Ciupitu 2011-11-23 06:40:15

16 réponses

la ou les machines distantes ne doivent pas nécessairement s'attendre à être installées. Vous pouvez installer expectate sur une station de travail locale ou VM (virtualbox) ou n'importe quelle boîte *nix, et écrire un wrapper qui appelle cela .ex (attendre) script (il peut y avoir des petits changements de distribution de distribution, cela testés sur 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
répondu Randy Katz 2012-11-11 09:30:03

Vous n'avez pas besoin d'un accès root pour utiliser passwd .

ça devrait marcher.

passwd <<EOF
old password
new password
new password
EOF
12
répondu Dennis 2011-11-23 02:47:20

, Vous devriez essayer pssh (parallèle ssh en même temps).

cat>~/ssh-hosts<<EOF
user100@host-foo
user200@host-bar
user848@host-qux
EOF

pssh -h ~/pssh-hosts 'printf "%s\n" old_pass new_pass new_pass | passwd'
10
répondu Gilles Quenot 2011-11-23 03:50:56

en me basant sur l'exemple de squashbuff, j'ai essayé ce qui suit, qui a bien fonctionné pour moi:

#!/bin/bash
for server in `cat hostlist`; do
echo $server;
ssh username@$server 'passwd &lt&ltEOF
old_password
new_password
new_password
EOF';
done

du point de vue de la sécurité, pourrait être amélioré pour prendre des entrées sans faire écho à l'écran ou sauver le plaintext sur le disque.

6
répondu fsckin 2012-05-02 23:10:50
echo "name:password" | chpasswd
4
répondu Poma 2013-06-04 13:31:06

une autre possibilité: le changer manuellement sur un serveur. Obtenez le mot de passe crypté dans /etc/shadow. Maintenant, faites quelque chose comme ceci:

for host in $HOST_LIST; do
    ssh $host "passwd -p 'encrypted_passwd' user"
done

bien sûr, 'encrypted_passwd" est ce que vous avez trouvé dans /etc/shadow où vous avez changé manuellement le mot de passe. Et $HOST_LIST est une liste d'hôtes où vous voulez que le mot de passe soit changé. Qui pourrait être créé simplement avec:

export HOST_LIST="server1 server2 server15 server67"

Ou peut-être avec un fichier (comme d'autres l'ont suggéré):

export HOST_LIST=`cat host_list.txt`

Où le fichier "host_list.txt" a une liste de tous les systèmes où vous voulez changer le mot de passe.

Edit: si votre version de passwd ne prend pas en charge l'option-p, vous pourriez avoir de la " usermod programme disponible. L'exemple ci-dessus reste le même, il suffit de remplacer "passwd" par "usermod".

en outre, vous pourriez considérer le outil utile pdsh , qui simplifierait l'exemple ci-dessus à quelque chose comme ceci:

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

un dernier "gotcha" à surveiller: le mot de passe crypté contient probablement le caractère de signe dollar ('$') comme séparateur de champ. Vous devrez probablement échapper à ceux de votre commande for loop ou pdsh (par exemple "$" devient "\$").

3
répondu Matt 2014-05-16 13:43:12
  1. Install sshpass sur n'importe quel serveur d'où vous voulez exécuter le script.

    yum -y install sshpass
    
  2. Préparer un fichier texte dans lequel vous devez passer des détails comme Hôte , Nom d'Utilisateur , Mot de passe et Port . (En fonction de vos besoins).

    192.168.1.2|sachin|dddddd|22
    
  3. préparez un fichier de script en utilisant les détails ci-dessous.

    #!/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 $USR@$HOST \
                -T "echo 'sachin@patel' | passwd --stdin root"                 \
                < /dev/null | tee -a output.log
    done
    
    exec 0<&3
    
2
répondu Sachin Patel 2014-05-15 13:15:48

une alternative que vous pourriez vouloir présenter à vos pairs serait de leur faire utiliser une authentification sans mot de passe. Ils produisaient une paire de clés publiques / privées et enregistraient leur clé publique dans le ~/.ssh/authorized_keys sur chacun des serveurs, ils se connecter.

1
répondu phatfingers 2011-11-23 03:21:41

pouvez-vous utiliser Perl?

Ici il y a un script qui modifie le mot de passe dans un ensemble d'hôtes.

si nécessite certains modules Perl ( Net::OpenSSH::Parallel , Expect et leurs dépendances) installés sur la machine locale exécutant le script mais rien sur les serveurs distants où le mot de passe doit être changé.

1
répondu salva 2011-11-23 07:45:36

avez-vous essayé App:: Unix:: RPasswd

1
répondu Kris 2011-11-23 16:47:55

le passmass script ( man page ) qui vient avec Expect ne nécessite pas Expect S'installer sur les machines distantes.

1
répondu Cristian Ciupitu 2014-05-15 03:47:54

a pensé que je devrais mettre ma solution dans un champ de réponse - pas sûr si cela devrait faire partie de la question..

OK, j'ai mis en place une solution partiellement fonctionnelle en utilisant la suggestion de Dennis.

des serveurs.txt ressemble à:

server1
server2
server3
.
.
.

j'utilise:

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

produit:

user@server1'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.
user@server2'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.

Donc, ici, j'ai encore besoin de taper mon ancien mot de passe pour chaque serveur. Cela peut-il être évité?

0
répondu squashbuff 2011-11-23 23:19:37

si vous avez ssh, pourquoi avoir des mots de passe en premier lieu? Appuyez sur la touche SSH publique de l'utilisateur sur tous les serveurs qu'ils sont autorisés à utiliser et être fait avec elle. Cela vous permet également d'accorder et de révoquer facilement l'accès Tout ce que vous voulez.

lors d'un précédent jobjob$, où nous avions littéralement des dizaines de milliers de serveurs, ils avaient une base de données dont les ingénieurs étaient autorisés sur quels serveurs, et l'installation des clés ssh était un processus automatisé. Presque personne n'avait de mot de passe N'importe quelle machine.

0
répondu Edward Falk 2012-08-03 18:24:17

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

0
répondu Lance Badger 2013-12-02 16:55:24
cat /tmp/passwords | ssh $server sudo chpasswd -e

si le mot de passe est crypté, ou

cat /tmp/passwords | ssh $server sudo chpasswd

si le mot de passe n'est pas crypté.

/tmp/les mots de passe doivent avoir le format de "utilisateur:mot de passe"

0
répondu Tom Mullahey 2016-10-02 15:56:36

la vraie question est pourquoi n'utilisaient-ils pas une sorte de services de noms? NIS / pages jaunes ou LDAP et vous n'avez pas à changer manuellement les mots de passe sur un tas de serveurs. Un utilisateur change son mot de passe une fois et c'est fait à travers le maître de domaine.

-2
répondu Stan 2015-06-08 12:11:58