Seu script está tentando combinar dois intérpretes. Você tem ambos #!/bin/bash
e #!/usr/bin/expect
. Isso não vai funcionar. Você pode usar apenas um dos dois. Desde o bash
primeiro, seu script está sendo executado como um script bash.
No entanto, dentro do seu script, você possui expect
comandos como spawn
e send
. Como o script está sendo lido bash
e não por expect
, isso falha. Você pode contornar isso escrevendo expect
scripts diferentes e chamando-os do seu bash
script ou traduzindo tudo para expect
.
A melhor maneira, porém, e que evita a prática horrível de ter suas senhas em texto sem formatação em um arquivo de texto simples, é configurar o ssh sem senha. Dessa forma, scp
você não precisará de uma senha e não precisará expect
:
Primeiro, crie uma chave ssh pública em sua máquina:
ssh-keygen -t rsa
Você será solicitado a fornecer uma senha que será solicitada a digitar na primeira vez em que executar qualquer comando ssh após cada login. Isso significa que, para vários comandos ssh ou scp, você precisará inseri-lo apenas uma vez. Deixe a senha vazia para acesso completamente sem senha.
Depois de gerar sua chave pública, copie-a para cada computador em 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 nome ou IP de um servidor em cada linha. Por exemplo:
host1
host2
host3
Como esta é a primeira vez que você faz isso, será necessário inserir manualmente a senha para cada IP, mas depois disso, você poderá 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