Tengo una red llena de máquinas Linux. En esta red tengo un usuario como usuario1 con la contraseña como contraseña en todas las máquinas.
Tengo el siguiente script para colocar archivos en el directorio de inicio de usuario1 en todas las máquinas de la red.
#!/usr/bin/expect -f
# connect via scp
spawn cat /home/user1/Desktop/IPlistfile.txt | while read line do
spawn scp /home/user1/Desktop/filetobesent.txt [email protected]${line}:/home/user1/Desktop
#######################
expect {
-re ".*es.*o.*" {
exp_send "yesr"
exp_continue
}
-re ".*sword.*" {
exp_send "passwordr"
}
}
interact
done
El problema es que recibo un mensaje de error como “can't read line. No such variable
“. Sin embargo, si uso una dirección IP directamente en lugar de la variable de línea, puedo transferir el archivo.
Editar :El IPlistfile.txt contiene la lista de direcciones IP en mi red. Cada línea contiene una única dirección IP.
Respuesta aceptada:
Puedo pensar en un par de formas de hacer esto, pero recomiendo configurar ssh
sin contraseña acceso, me lo agradecerás más tarde.
1. Configure el acceso sin contraseña a sus máquinas.
Este es, con mucho, el mejor método, ya que seguramente querrá volver a conectarse a las máquinas y esto le hará la vida mucho más fácil. También es mucho, mucho más seguro que las otras opciones, incluso si elige usar una frase de contraseña vacía, ya que no estará lanzando contraseñas sin cifrar.
Primero, crea un ssh
público clave en su máquina:
ssh-keygen -t rsa
Se le pedirá una frase de contraseña que se le pedirá que ingrese la primera vez que ejecuta cualquier comando ssh después de cada inicio de sesión. Esto significa que para múltiples ssh
o scp
comandos, sólo tendrá que introducirlo una vez. Sin embargo, puede dejarlo vacío para tener un acceso completamente sin contraseña.
Una vez que haya generado su clave pública, cópiela (como user1
) a cada computadora en su red:
while read ip; do
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]$ip
done < IPlistfile.txt
Tendrá que ingresar manualmente la contraseña para cada IP (a menos que también use una de las soluciones a continuación para este paso), pero una vez que lo haya hecho, podrá copiar archivos a cualquiera de estas máquinas con un simple:
while read ip; do
scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt
Si tiene sshpass
instalado, puede automatizar esto para que no tenga que escribir su contraseña para cada máquina:
SSHPASS='password'
while read ip; do
sshpass -e scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt
2. Instalar sshpass
Este es un pequeño e ingenioso programa que te permite pasar un ssh
contraseña como un parámetro de línea de comando. Obviamente, esta no es una solución muy segura y le recomiendo que lea la sección "Consideraciones de seguridad" de man sshpass
.
De todos modos, probablemente esté disponible en los repositorios de su distribución, en sistemas basados en Debian se puede instalar con
sudo apt-get install sshpass
No puedo verificar ya que no tengo una máquina basada en RedHat, pero por lo que puedo decir al buscar aquí, debería poder instalarse en Fedora con
sudo yum install sshpass
Una vez que lo tengas instalado, simplemente puedes ejecutar
SSHPASS='password'
while read ip; do
sshpass -e scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt
El -e
opción le dice a sshpass
para obtener la contraseña del SSHPASS
variable. Esto es un poco más seguro que darlo como parámetro con -p
opción.
IMPORTANTE:
Esto fallará silenciosamente si el servidor al que se está conectando es desconocido, si su clave pública no está almacenada en su máquina. Si esto no parece funcionar, simplemente conéctese una vez (ssh
o scp
) a la máquina remota y acepte su clave pública.
3. Usa pscp
en cambio
pscp
es una alternativa a scp
que acepta la contraseña como un parámetro de línea de comandos. En sistemas basados en Debian, esto se puede instalar con
sudo apt-get install putty-tools
Como dije antes, no puedo comprobarlo, pero debería poder instalarse en Fedora con
sudo yum install putty
A continuación, puede copiar sus archivos con
while read ip; do
pscp -pw password /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt