Seu script está tentando combinar dois intérpretes. Você tem os dois #!/bin/bash
e #!/usr/bin/expect
. Isso não vai funcionar. Você só pode usar um dos dois. Como bash
foi o primeiro, seu script está sendo executado como um script bash.
No entanto, no seu script, você tem expect
comandos, como spawn
e send
. Como o script está sendo lido por bash
e não por expect
, isso falhará. Você poderia contornar isso escrevendo diferentes scripts expect
e chamando-os de seu script bash
ou traduzindo tudo para expect
.
A melhor maneira, porém, e uma que evite a prática horrível de ter suas senhas em texto simples em um arquivo de texto simples, é configurar o ssh sem senha. Dessa forma, o scp
não precisará de uma senha e você não precisa de expect
:
-
Primeiro, crie uma chave ssh pública na sua máquina:
ssh-keygen -t rsa
Você será perguntado por uma senha que será solicitada a digitar na primeira vez que executar qualquer comando ssh após cada login. Isso significa que, para vários comandos ssh ou scp, você só precisará inseri-lo uma vez. Deixe a senha vazia para acesso totalmente sem senha.
-
Depois de gerar sua chave pública, copie-a para cada computador da sua rede:
while read ip; do ssh-copy-id -i ~/.ssh/id_rsa.pub user1@$ip done < IPlistfile.txt
O
IPlistfile.txt
deve ser um arquivo contendo o nome do servidor ou IP em cada linha. Por exemplo:host1 host2 host3
Como esta é a primeira vez que você faz isso, você terá que inserir manualmente a senha para cada IP, mas uma vez feito isso, você será capaz de copiar arquivos para qualquer uma dessas máquinas com um simples:
scp file user@host1:/path/to/file
-
Remova a expectativa do seu script. Agora que você tem acesso sem senha, pode usar seu 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