Ваш сценарий пытается объединить двух переводчиков. У вас есть и то #!/bin/bash
и другое #!/usr/bin/expect
. Это не сработает. Вы можете использовать только один из двух. Так как он bash
был первым, ваш скрипт запускается как скрипт bash.
Однако в вашем скрипте есть expect
такие команды, как spawn
и send
. Поскольку скрипт читается, bash
а не читается expect
, это не удается. Вы можете обойти это, написав различные expect
сценарии и вызывая их из своего bash
сценария или переведя все это в expect
.
Однако лучший способ, позволяющий избежать ужасной практики хранения ваших паролей в виде простого текста в простом текстовом файле, - это установить ssh без пароля. Таким образом, вам scp
не понадобится пароль и вам не нужно expect
:
Сначала создайте открытый ключ ssh на вашем компьютере:
ssh-keygen -t rsa
Вас попросят ввести ключевую фразу, которую вам нужно будет ввести при первом запуске любой команды ssh после каждого входа в систему. Это означает, что для нескольких команд ssh или scp вам нужно будет ввести его только один раз. Оставьте парольную фразу пустой для доступа без пароля.
После того как вы сгенерировали свой открытый ключ, скопируйте его на каждый компьютер в вашей сети:
while read ip; do
ssh-copy-id -i ~/.ssh/id_rsa.pub user1@$ip
done < IPlistfile.txt
IPlistfile.txt
Должен быть файл , содержащий имя сервера или IP - адрес в каждой строке. Например:
host1
host2
host3
Поскольку вы делаете это впервые, вам придется вручную вводить пароль для каждого IP-адреса, но как только вы это сделаете, вы сможете скопировать файлы на любой из этих компьютеров с помощью простого:
scp file user@host1:/path/to/file
Удалите ожидание из вашего скрипта. Теперь, когда у вас есть доступ без пароля, вы можете использовать свой скрипт как:
#!/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