Su guión está intentando combinar dos intérpretes. Tienes ambos #!/bin/bash
y #!/usr/bin/expect
. Eso no funcionará. Solo puedes usar uno de los dos. Desde el bash
principio, su script se ejecuta como un script bash.
Sin embargo, dentro de su script, tiene expect
comandos como spawn
y send
. Dado que el script está siendo leído por bash
y no por expect
, esto falla. Puede solucionar esto escribiendo diferentes expect
guiones y llamándolos desde su bash
guión o traduciéndolo todo expect
.
Sin embargo, la mejor manera, y una que evita la práctica horrible de tener sus contraseñas en texto plano en un archivo de texto simple, es configurar ssh sin contraseña. De esa manera, scp
no necesitará una contraseña y no necesita expect
:
Primero, cree una clave ssh pública 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 ejecute cualquier comando ssh después de cada inicio de sesión. Esto significa que para múltiples comandos ssh o scp, solo tendrá que ingresarlo una vez. Deje la frase de contraseña vacía para un acceso completamente sin contraseña.
Una vez que haya generado su clave pública, cópiela en cada computadora de su red:
while read ip; do
ssh-copy-id -i ~/.ssh/id_rsa.pub user1@$ip
done < IPlistfile.txt
El IPlistfile.txt
debe ser un archivo que contiene el nombre de un servidor o IP en cada línea. Por ejemplo:
host1
host2
host3
Como esta es la primera vez que hace esto, tendrá que ingresar manualmente la contraseña para cada IP, pero una vez que lo haya hecho, podrá copiar archivos a cualquiera de estas máquinas con un simple:
scp file user@host1:/path/to/file
Elimina la expectativa de tu script. Ahora que tiene acceso sin contraseña, puede usar su script como:
#!/bin/bash
echo "I will fail if you give junk values!!"
echo " "
echo "Enter file name: "
read filePath
echo " "
echo "Where you want to copy?"
echo "Enter"
echo "1. if Host1"
echo "2. if Host2"
echo "3. if Host3"
read choice
echo " "
if [ $choice -eq "1" ]
then
scp filePath uname@host1:/usr/tmp
elif [ $choice -eq "2" ]
then
scp filePath uname@host2:/usr/tmp
elif [ $choice -eq "3" ]
then
scp filePath uname@host3:/usr/tmp
else
echo "Wrong input"
fi