Я использую Mac OS X 10.9.4, следующий скрипт для копирования файлов с локального компьютера на другой хост
#!/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
при запуске этого скрипта я получаю следующее
./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
источник
источник
Ответы:
Ваш сценарий пытается объединить двух переводчиков. У вас есть и то
#!/bin/bash
и другое#!/usr/bin/expect
. Это не сработает. Вы можете использовать только один из двух. Так как онbash
был первым, ваш скрипт запускается как скрипт bash.Однако в вашем скрипте есть
expect
такие команды, какspawn
иsend
. Поскольку скрипт читается,bash
а не читаетсяexpect
, это не удается. Вы можете обойти это, написав различныеexpect
сценарии и вызывая их из своегоbash
сценария или переведя все это вexpect
.Однако лучший способ, позволяющий избежать ужасной практики хранения ваших паролей в виде простого текста в простом текстовом файле, - это установить ssh без пароля. Таким образом, вам
scp
не понадобится пароль и вам не нужноexpect
:Сначала создайте открытый ключ ssh на вашем компьютере:
Вас попросят ввести ключевую фразу, которую вам нужно будет ввести при первом запуске любой команды ssh после каждого входа в систему. Это означает, что для нескольких команд ssh или scp вам нужно будет ввести его только один раз. Оставьте парольную фразу пустой для доступа без пароля.
После того как вы сгенерировали свой открытый ключ, скопируйте его на каждый компьютер в вашей сети:
IPlistfile.txt
Должен быть файл , содержащий имя сервера или IP - адрес в каждой строке. Например:Поскольку вы делаете это впервые, вам придется вручную вводить пароль для каждого IP-адреса, но как только вы это сделаете, вы сможете скопировать файлы на любой из этих компьютеров с помощью простого:
Удалите ожидание из вашего скрипта. Теперь, когда у вас есть доступ без пароля, вы можете использовать свой скрипт как:
источник
Ваш код может быть намного более кратким:
Если вы настроили ssh-ключи как предложено, это даже лучше:
источник
spawn
этоexpect
команда . Это не будет работать, если ваш переводчик/bin/bash
.источник