Я сам придумал ответ после нескольких мучительных часов. На самом деле это был серверный сертификат, который mod_nss создает при установке, чем был неправильно настроен.
Я удалил все ключи из базы данных и воссоздал необходимые ключи по отдельности с нуля (казалось, их было 2, один с именем хоста в качестве CN, а другой с доменом в качестве CN).
Ваш сценарий пытается объединить два интерпретатора. У вас есть и #!/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
хост2
хост3
Поскольку вы делаете это впервые, вам придется вручную ввести пароль для каждого IP, но как только вы это сделаете, вы сможете копировать файлы на любую из этих машин с помощью простой команды:
scp file user@host1:/path/to/file
Удалите expect из вашего скрипта. Теперь, когда у вас есть беспарольный доступ, вы можете использовать ваш скрипт так:
#!/bin/bash
echo "Я потерплю неудачу, если вы дадите нежелательные значения!!!"
echo " "
echo "Введите имя файла: "
read filePath
echo " "
echo "Куда вы хотите скопировать?"
echo "Enter"
echo "1. if Host1"
echo "2. if Host2"
echo "3. if Host3"
прочитать выбор
echo " "
if [ $choice -eq "1" ]
then
scp filePath uname@host1:/usr/tmp
elif [ $choice -eq "2" ]
, тогда
scp filePath uname@host2:/usr/tmp
elif [ $choice -eq "3" ]
, тогда
scp filePath uname@host3:/usr/tmp
else
echo "Неправильный ввод"
fi
Ваш код может быть намного более кратким:
#!/bin/bash
read -p "Enter file name: " filePath
if ! [[ -r $filePath ]]; then
echo "cannot read $filePath"
exit 1
fi
PS3="Where you want to copy? "
select host in host1 host2 host3; do
if [[ -n $host ]]; then
expect <<END
spawn scp "$filePath" uname@$host:/usr/tmp
expect "password"
send "MyPassword\r"
expect eof
END
break
fi
done
Если вы настроите ключи ssh, как предлагается, это будет еще лучше:
if [[ -n $host ]]; then
scp "$filePath" uname@$host:/usr/tmp
break
fi
spawn
- это команда expect
. Это не сработает, если ваш интерпретатор / bin / bash
.