LinuxForum.Fans
Тема

SSH соединение с помощью expect

Автор: forroboform 10 сообщений 1660 просмотров
#388223

Пытаюсь решить такую задачку на BASH.

1.Имеем файл base.txt вида:
admin1@10.10.10.1:pass1
admin2@10.10.10.2:pass2
admin3@10.10.10.3:pass3
2.Запускаем "SH-скрипт", который:
- считывает данные из файла base.txt в массив
т.е. получаем нечто такое:
$servers = array("admin1@10.10.10.1:pass1", "admin2@10.10.10.2:pass2", "admin3@10.10.10.3:pass3");
Далее:
- считаем количество ключей -1, для дальнейшего перебора в цикле по ключу
- запускаем цикл
- обращаемся к $key=0 => $servers[$key], вытаскиваем значение, которое затем "режем на переменные"
$user = "admin1";
$serv = "10.10.10.1";
$pass = "pass1";

Дальше примерно так:
#!/usr/bin/expect -f
set timeout 2
set USER "$user"
set HOST "$serv"
set PASS "$pass1"

spawn ssh $USER@$HOST
expect (тут непонятка!!!)
send "yes\r"

Суть непонятки: пытаемся подключиться с моей Linux машины по списку серверов к серверу №1
Запустили SSH с логином и IP и в ответ получаем запрос на согласие добавить "чего то там, куда то там" ...
Такие запросы будут всегда разными (собственно автоматизация для этого и нужна).
Но ответ всегда будет YES.
После ответа YES => последует ввод пароля send "$PASS\r" и затем еще 10 команд и так до конца цикла.

Нужно "получить вопрос" в виде подтверждения на добавление ключа и сравнить его с "шаблоном"
Но с этим как раз засада (вопросы всегда разные ...).
Далее забить ответ с помощью send "yes\r"

Как это можно решить c expect + bash?

#388225

Туда, где "непонятка", надо написать regex для "вопросы всегда разные " :)

#388228
"Macumazan" написал:
надо написать regex для "вопросы всегда разные "

только нужно ещё не забыть про флаг -re... вообще man expect — оно довольно мощная штука... правда придётся попутно вникнуть в основы tcl'я....

forroboform, как вариант проще и вообще Ъ — передать ssh'у пару опций, чтоб он не задавал этих глупых вопросов...

#388229

Тут дело немного не в этом!
ls -lia 1> "$my_info" (данные в переменную сохраняются)

В моем случае ответ такой:

ssh user@4.1.1.1 1> "$my_info" (Но данные в переменную НЕ сохраняются!)

#388233
forroboform написал:
Тут дело немного не в этом!
ls -lia 1> "$my_info" (данные в переменную сохраняются)

В моем случае ответ такой:

ssh user@4.1.1.1 1> "$my_info" (Но данные в переменную НЕ сохраняются!)

ssh user@4.1.1.1 2 > &1 > "$my_info" А так?

#388243
"CyberDaemon" написал:
ssh user@4.1.1.1 2 > &1 > "$my_info" А так?

Текст не сохраняется.

#388247
"forroboform" написал:
Запустили SSH с логином и IP и в ответ получаем запрос на согласие добавить "чего то там, куда то там" ...

есть опция которая добавляет ключик или нет, я использую опцию не добавлять

StrictHostKeyChecking=no

т.е. где:
spawn ssh $USER@$HOST
надо делать так:
spawn ssh -o StrictHostKeyChecking=no $USER@$HOST

А вообще что бы с expect и ssh не мучаться, то используетй утилиту sshpass или ипользуй авторизацию по ключам.

#388254

Благодарю Вас i2ks за дельное предложение относительно -o StrictHostKeyChecking=no

#388256
"Fat-Zer" написал:
forroboform, как вариант проще и вообще Ъ — передать ssh'у пару опций, чтоб он не задавал этих глупых вопросов...

вообще тебе еще вчера про это сказали.

#388259

Да Вы правы, вчера об этом писали!
Прошу прощения, видимо от жары мозги плавятся и невнимательность в результате.

Войдите или зарегистрируйтесь, чтобы ответить.