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?
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
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
, 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'
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 <<EOF 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.
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 "\$").
-
Install sshpass sur n'importe quel serveur d'où vous voulez exécuter le script.
yum -y install sshpass
-
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
-
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
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.
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é.
le passmass script ( man page ) qui vient avec Expect ne nécessite pas Expect S'installer sur les machines distantes.
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é?
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.
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"
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.