spawn - команда не найдена!

Я сам придумал ответ после нескольких мучительных часов. На самом деле это был серверный сертификат, который mod_nss создает при установке, чем был неправильно настроен.

Я удалил все ключи из базы данных и воссоздал необходимые ключи по отдельности с нуля (казалось, их было 2, один с именем хоста в качестве CN, а другой с доменом в качестве CN).

17
28.02.2015, 16:54
3 ответа

Ваш сценарий пытается объединить два интерпретатора. У вас есть и #!/bin/bash, и #!/usr/bin/expect. Это не сработает. Вы можете использовать только один из двух вариантов. Поскольку bash был первым, ваш сценарий выполняется как сценарий bash.

Однако, внутри вашего сценария есть expect команды, такие как spawn и send. Поскольку сценарий читается bash, а не expect, это не удается. Вы можете обойти это, написав различные expect скрипты и вызывая их из вашего bash скрипта или переведя все в expect.

Однако лучшим способом, позволяющим избежать ужасной практики хранения паролей открытым текстом в простом текстовом файле, является установка беспарольного ssh. Таким образом, scp не будет нуждаться в пароле, а вам не нужно будет expect:

  1. Сначала создайте открытый ключ ssh на вашей машине:

    ssh-keygen -t rsa
    

    Вам будет предложено ввести парольную фразу, которую нужно будет вводить при первом запуске любой команды ssh после каждого входа в систему. Это означает, что для нескольких команд ssh или scp вам нужно будет ввести ее только один раз. Оставьте парольную фразу пустой для доступа без пароля.

  2. После создания открытого ключа скопируйте его на каждый компьютер в вашей сети:

    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
    
  3. Удалите 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
    
22
29.04.2021, 00:31

Ваш код может быть намного более кратким:

#!/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
5
29.04.2021, 00:31

spawn - это команда expect . Это не сработает, если ваш интерпретатор / bin / bash .

3
29.04.2021, 00:31

Теги

Похожие вопросы