pública - Script para cambiar la contraseña en servidores linux sobre ssh
instalar ssh en ubuntu server 16 (16)
Instale sshpass en cualquiera de los servidores desde donde desea ejecutar el script.
yum -y install sshpass
Prepare un archivo de texto en el que tenga que pasar detalles como Host , Nombre de usuario , Contraseña y Puerto . (Basado en su requerimiento).
192.168.1.2|sachin|dddddd|22
Prepare un archivo de script utilizando los detalles a continuación.
#!/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
Tenemos una serie de servidores de Red Hat Linux en nuestro entorno de TI. Los miembros de mi equipo me piden que escriba un script (preferiblemente shell script) para cambiar la contraseña de un usuario en cada uno de ellos de una sola vez, usando SSH.
He intentado encontrar una solución, pero muchos de los scripts que encontré están usando Expect. No tenemos Expect instalado en nuestros servidores y los administradores del sistema se han negado a permitirnos instalarlo. Además, los usuarios no tienen acceso de root, por lo que no se pueden usar passwd --stdin
o chpasswd
.
¿Hay alguna forma de escribir un script para que un usuario pueda ejecutarlo y cambiar la contraseña de solo su propio usuario en todos los servidores de una lista?
¿Has probado la App::Unix::RPasswd
¿Puedes usar Perl?
Here hay un script que cambia la contraseña en un conjunto de hosts.
Si requiere algunos módulos Perl ( Net :: OpenSSH :: Parallel , Expect y sus dependencias) instalados en la máquina local que ejecuta el script, pero nada en los servidores remotos donde se debe cambiar la contraseña.
Basándome en el ejemplo de squashbuff, probé lo siguiente, que funcionó bien para mí:
#!/bin/bash for server in `cat hostlist`; do echo $server; ssh username@$server ''passwd <<EOF old_password new_password new_password EOF''; done
En cuanto a la seguridad, podría mejorarse para recibir información sin hacer eco en la pantalla O guardar el texto en el disco.
Debe intentar pssh (ssh paralelo al mismo tiempo).
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''
El script de passmass ( página del manual ) que viene con Expect no requiere que se espere que esté instalado en las máquinas remotas.
La (s) máquina (s) remota (s) no necesitan esperar instalada Puede instalar expect en una estación de trabajo local o VM (virtualbox) o cualquier casilla * nix, y escribir un contenedor que llame a este script .ex (expect) (puede haber pequeños cambios de distro a distro, esto se prueba en 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
La verdadera pregunta es ¿por qué no estaban usando algún tipo de servicio de nombres? NIS / Yellow Pages o LDAP, y no tendrá que cambiar las contraseñas de forma manual en varios servidores. Un usuario cambia su contraseña una vez y se hace a través del maestro de dominio.
No necesita acceso de root para usar passwd
.
Esto debería funcionar bien.
passwd <<EOF
old password
new password
new password
EOF
Otra posibilidad: cambiarlo manualmente en un servidor. Obtenga la contraseña cifrada de / etc / shadow. Ahora, haz algo como esto:
for host in $HOST_LIST; do
ssh $host "passwd -p ''encrypted_passwd'' user"
done
Por supuesto, ''encrypted_passwd "es lo que obtuvo de / etc / shadow donde cambió la contraseña manualmente. Y $ HOST_LIST es una lista de hosts donde desea que se cambie la contraseña. Esto se puede crear simplemente con:
export HOST_LIST="server1 server2 server15 server67"
O tal vez con un archivo (como otros han sugerido):
export HOST_LIST=`cat host_list.txt`
Donde el archivo "host_list.txt" tiene una lista de todos los sistemas donde desea cambiar la contraseña.
Edición: si su versión de passwd no admite la opción -p, es posible que tenga disponible el programa ''usermod''. El ejemplo anterior sigue siendo el mismo, simplemente reemplace ''passwd'' con ''usermod''.
Además, podría considerar la herramienta útil pdsh , que simplificaría el ejemplo anterior a algo como esto:
echo $HOST_LIST | pdsh -Rssh -w- "usermod -p ''encrypted_passwd'' user"
Un último "gotcha" a tener en cuenta: la contraseña cifrada probablemente contiene el carácter de signo de dólar (''$'') como separador de campo. Probablemente tendrás que escapar de los comandos for / loop o pdsh (es decir, "$" se convierte en "/ $").
Pensé que debería poner mi solución en un campo de respuesta, no estoy seguro si esto debería ser parte de la pregunta.
Bien, he reunido una solución parcialmente funcional utilizando la sugerencia de Dennis.
servers.txt se parece a:
server1
server2
server3
.
.
.
Estoy usando:
for server in `cat servers.txt`; do
ssh $server -l user ''passwd <<EOF
old_pass
new_pass
new_pass
EOF'';
done
Esto produce:
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.
Así que aquí, todavía tengo que escribir mi contraseña anterior una vez para cada servidor. ¿Se puede evitar esto?
Si tiene ssh, ¿por qué tener contraseñas en primer lugar? Empuje la clave pública ssh del usuario a todos los servidores para los que está autorizado a usar y terminar con ella. Esto también le permite otorgar y revocar fácilmente todo lo que desee.
En un trabajo anterior de $ day, donde teníamos literalmente decenas de miles de servidores, tenían una base de datos de los ingenieros permitidos en qué servidores, y la instalación de claves ssh era un proceso automatizado. Casi NADIE tenía una contraseña en CUALQUIER máquina.
Una alternativa que tal vez desee presentar a sus pares sería hacer que usen autenticación sin contraseña. Generarían un par de claves públicas / privadas y registrarían su clave pública en el archivo ~ / .ssh / authorized_keys en cada uno de los servidores en los que inician sesión.
echo -e "wakka2 / nwakka2 / n" | raíz de contraseña
cat /tmp/passwords | ssh $server sudo chpasswd -e
si la contraseña está encriptada, o
cat /tmp/passwords | ssh $server sudo chpasswd
Si la contraseña no está encriptada.
/ tmp / las contraseñas deben tener el formato de "usuario: contraseña"
echo "name:password" | chpasswd