Тестирование существования аккаунта с использованием ожидаемого - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть список из 400 серверов, и мне нравится проверять существование учетной записи Unix, ожидая зацикливания

Я написал скрипт bash, использующий команду ожидаемого, но он возвращает мне сообщение об ошибке, что я не понимаю значения

#!/bin/bash
fic_serv="test.txt"
echo "Passwd"
stty -echo
read -s passwd
stty echo
suffix="suffix"
account="acc"


for server in `cat $fic_serv`
do
        prompt="[$acc@$server ~]$ "
        expect -c "
        spawn ssh -o StrictHostKeyChecking=no $account@$server.$suffix
        expect  "Password: "
        send "$passwd\r"
        expect $prompt
        send "logout\r"
        "
done


[acc@serv ~]$ couldn't read file "
        send "passwd\r"
        expect [acc@server ~]$
        send "logout\r"
        ": no such file or directory

(я изменил значение)

Ответы [ 3 ]

2 голосов
/ 10 апреля 2019

Вы должны использовать while, а не for, для анализа файлов в Bash. Используйте «перенаправление», чтобы рассматривать файл как стандартный ввод и читать по одной строке за раз.

while read server; do
  ...
done < $fic_serv

Ваша главная проблема - Expect интерпретирует ваши " s как «конец сценария». Избегайте их, как в \", или используйте {}, как в:

 expect -c "
        spawn ssh -o StrictHostKeyChecking=no $account@$server.$suffix
        expect {Password: }
        send {$passwd\r}
        expect $prompt
        send {logout\r}
        "
1 голос
/ 10 апреля 2019

Если у вас есть 400 серверов для управления, я настоятельно рекомендую использовать ansible.

Вы можете просто поместить список хостов в файл, назовем его inventory и выполнить следующую команду:

ansible -i inventory -m shell -a "id acc" all
0 голосов
/ 10 апреля 2019

Использование here-docs в командной оболочке для встраивания кода для другого языка обычно лучше, чем использование кавычек в аду, а совместное использование переменных в среде проще и безопаснее, чем расширение параметров:

export account passwd
while IFS= read -r server; do
    export prompt="[$acc@$server ~]$ "
    export host="$server.$suffix"
    expect << 'END_EXPECT'
        spawn ssh -o StrictHostKeyChecking=no $env(account)@$env(host)
        expect  "Password: "
        send "$env(passwd)\r"
        expect $env(prompt)
        send "logout\r"
        expect eof
END_EXPECT
done < "$fic_serv"

Как показано, мне нравится делать отступ в heredoc, чтобы сделать его более очевидным.

И в зависимости от сообщения об ошибке или запроса на вход в систему может быть больше логики, чтобы указать, что имя учетной записи и / или пароль неверны.

...