Estou usando o Mac OS X 10.9.4. A seguir, meu script para copiar arquivos da máquina local para outro host
#!/bin/bash
#!/usr/bin/expect
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
spawn scp filePath uname@host1:/usr/tmp
expect "password"
send "MyPassword\r"
interact
elif [ $choice -eq "2" ]
then
spawn scp filePath uname@host2:/usr/tmp
expect "password"
send "MyPassword\r"
interact
elif [ $choice -eq "3" ]
then
spawn scp filePath uname@host3:/usr/tmp
expect "password"
send "MyPassword\r"
interact
else
echo "Wrong input"
fi
ao executar esse script, estou recebendo os seguintes
./rcopy.sh: line 21: spawn: command not found
couldn't read file "password": no such file or directory
./rcopy.sh: line 23: send: command not found
./rcopy.sh: line 24: interact: command not found
bash
shell-script
expect
dev2d
fonte
fonte
Respostas:
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 obash
primeiro, seu script está sendo executado como um script bash.No entanto, dentro do seu script, você possui
expect
comandos comospawn
esend
. Como o script está sendo lidobash
e não porexpect
, isso falha. Você pode contornar isso escrevendoexpect
scripts diferentes e chamando-os do seubash
script ou traduzindo tudo paraexpect
.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:
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:
O
IPlistfile.txt
deve ser um arquivo contendo nome ou IP de um servidor em cada linha. Por exemplo: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:
Remova a expectativa do seu script. Agora que você tem acesso sem senha, pode usar seu script como:
fonte
Seu código pode ser muito mais conciso:
Se você configurar as teclas ssh conforme sugerido, é ainda melhor:
fonte
spawn
é umexpect
comando . Não funcionará se o seu intérprete estiver/bin/bash
.fonte