LINUX.ORG.RU

expect и bash

 ,


1

1

Люди добры, подскажите, никак не могу сообразить, как передать переменную скрипту на expect из скрипта на bash?

Например:

#!/bin/bash
pass=123
ла-ла-ла
expect -c '
spawn ssh -p 22 admin@192.168.0.1;
expect password ;
send "$pass\n" ;
send "cd /var/logr";
expect "ssh>"'

Так скрипт ругнется, если задать переменную как «set pass 123», после expect -c то всё нормально. Я понимаю, что когда выхывается expect он определяет свои переменные Но, мне нужно значение переменной именно до expect -c.

★★

'...' -> "..." но тогда придется экранировать: ` $ " (может еще что).

Лучше отдельный файл: передавать аргументом, а там $argv.

anonymous ()
pass=123
expect  <<EOF
spawn ssh -p 22 admin@192.168.0.1;
expect password ;
send "$pass\n" ;
send "cd /var/logr";
expect "ssh>" 
EOF

Либо:

pass=123
expect -c "
spawn ssh -p 22 admin@192.168.0.1;
expect password ;
send \"$pass\n\" ;
send \"cd /var/logr\";
expect \"ssh>\""
Еще варианты: юзать авторизацию по ключу, юзать отдельный expect скрипт, передавать ему аргументы.

cx ★★ ()
Ответ на: комментарий от anonymous

Если хочется внутри, тогда вероятно лучше (чем ""):

expect_cmd() {
  cat <<EOF
  ...
EOF
}

expect -c "$(expect_cmd)"
anonymous ()
Ответ на: комментарий от cx

Я вот путаюсь сделать проверку, по типу:

Если открытый ключ новый, то выполняется:

expect continue;

send «yes\n»

Если открытый ключ присутствует, то:

expect password: ;

send «$pass\n» ;

Делаю через if else по примеру из мана, что-то не хочет корректно отрабатывать.

Прошу подсказать, как будет выглядеть конструкция?

nixit ★★ ()
Ответ на: комментарий от nixit

Похоже, это делается так:

expect { -re «RSA key fingerprint» {send «yes\r»} timeout {puts «Host is known»} }

nixit ★★ ()

можешь вот так:

$ XYZ="test"
$ echo '123'$XYZ'456'
123test456
$ XYZ='$/$XYZ   \t\r\n'
$ echo '123'$XYZ'456'
123$/$XYZ \t\r\n456
только надо проверить, что в $XYZ не будет ничего такого, чем expect подавится.

drBatty ★★ ()
Ответ на: комментарий от nixit

Если имеется ввиду fingerprint, и если ты, как видно, собираешься принимать все отпечатки подряд, то я считаю лучше юзать:

ssh -oStrictHostKeyChecking=no

И все же, подумай про авторизацию по ключам. То, что ты делаешь просто мега-костыльно и несекурно.

UPD: вспомнил еще sshpass. Тоже не фонтан, но лучше чем велосипед.

cx ★★ ()
Последнее исправление: cx (всего исправлений: 2)
Ответ на: комментарий от cx

Увы, авторизация по ключам невозможна по некоторым причинам. Про опечатки не совсем понял.

nixit ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.