Ваш сценарій намагається поєднати двох перекладачів. У вас є і те, #!/bin/bash
і #!/usr/bin/expect
. Це не вийде. Можна використовувати лише одне з двох. З 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