LINUX.ORG.RU

[expect] как правильно получить код завершения процесса?

 


0

1
#!/usr/bin/expect -f
...
spawn -noecho ssh -C "$user@$host" $cmds

expect {
    -re "connecting .yes/?no.*" {
        exp_send "yes\r"
        exp_continue
    } -re "$user@$host's .assword:.*" {
        exp_send "$password\r"
        exp_continue
    } eof
}

catch wait result
exit [lindex $result 3]

По ssh удалённо выполняется сложный скрипт. Этот сложный скрипт выполняет другие системные команды, ставит deb пакеты, запускает что-то в фоне, и т.д. Где-то секунд через 15 от начала его работы expect перестаёт получать от него данные (stdout), в списках процессов на удалённой машине я могу наблюдать как он работает и успешно завершается, но expect не реагирует больше ни на что. Если вместо catch/exit вставить interact, то нет проблем - виден весь stdout, ничего не зависает. Но после interact не остаётся кода завершения удалённого скрипта, а он позарез нужен... Что посоветуете, как правильно получить код завершения удалённого скрипта?

А вообще делать сложные вещи экспектом - мазохизм :) Попробуй весь вывод в почту себе отправить )

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

expect нужен только для автоматизации ssh, всю работу делает удалённый скрипт. Какие есть ещё средства автоматизации? SSH ключи не подходят.

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

use Net::SSH::Perl;

my $ssh = Net::SSH::Perl->new($host);

$ssh->login($user, $pass);

my($stdout, $stderr, $exit) = $ssh->cmd($cmd);

Runs the command $cmd on the remote server and returns the stdout, stderr, and exit status of that command.

Вроде так.

sun-lsd
()
Ответ на: комментарий от Jetty

вобщем переписал на питоне, каким-то образом тот же код но в питоновской одёжке работает нормально.

former_anonymous ★★★
() автор топика

Лучше не занимайтесь мазохизмом, а осильте empty (в debian - пакет empty-expect).

Это просто программа, которая открывает pty и связывает его с двумя именованными FIFO-каналами. При этом ввод-вывод и его анализ можно производить любыми средствами, просто записывая ввод и считывая вывод при помощи этих самых FIFO-каналов.

Deleted
()
Ответ на: комментарий от former_anonymous

С этим проблем нет, можно связать stdout удаленного процесса с любой функцией, которая обрабатывает данные по мере поступления.

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