Ненадежные результаты от Expect при запуске удаленного скрипта - PullRequest
0 голосов
/ 29 октября 2018

Поскольку моя компания настаивает на использовании sudo, мне нужно отказаться от системы ssh, которую я создал для запуска удаленных команд.

У меня есть скрипт, который подключается к серверу, sudo в учетную запись владельца экземпляра db2, а затем запускает скрипт (ранее доставленный в / tmp). Может быть, 1 из 10 раз это будет работать (выводит «Hello world» для моего теста).

Вот скрипт ksh на удаленном сервере (/tmp/cwow/generic.ksh):

#!/usr/bin/ksh93
echo "Hello world"

[Я также пытался добавить сон 5 и ждать со смешанными результатами, но это не решает проблему]

Локальный сценарий ожидания, который я запускаю:

#!/usr/bin/expect

set spath /tmp/cwow/generic.ksh

set pass $env(MYEXPECTPASS)
set user $env(MYEXPECTUSER)

if { [llength $argv] != 2 } {
        send_user "USAGE: $argv0 host inst\n"
        exit
}
set host   [lindex $argv 0]
set inst   [lindex $argv 1]

set timeout 10
log_user 1
exp_internal 0

eval spawn /usr/bin/ssh -t $user@$host "sudo su - cwow"
expect {
        timeout { send_user "TimedOut"; exit }

        -glob "assword:" {
                send "$pass\r"
                expect {
                        -glob "assword:" {
                                send "$pass\r"
                                expect {
                                        -glob " " {
                                                send "/tmp/cwow/generic.ksh\r\n"
                                                expect {
                                                        -glob "world" {
                                                                send_user "Got it\r"
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
}

Я должен также отметить, что я никогда не получаю сообщение «Понял», но мне это не нужно, просто любопытно, почему это не так. Что мне нужно для надежной работы - это чтобы скрипт работал, и в большинстве случаев он не работает.

Любые идеи для слабых ожидаемых пользователей будут с благодарностью.

1 Ответ

0 голосов
/ 29 октября 2018

(не ответ, просто отформатированный комментарий)

Вам не нужно вкладывать все ожидаемые команды: если вы ожидаете шаблон без тела действия, скрипт продолжит выполнение следующей команды. Это более читабельно, ИМО:

expect {
    timeout { send_user "TimedOut"; exit }
    "assword:" 
}
send "$pass\r"
expect "assword:" 
send "$pass\r"
expect " "
send "/tmp/cwow/generic.ksh\r"
expect "world" 
send_user "Got it\n"

Обратите внимание, вы должны send к порожденному процессу с \r как "нажатием Enter". Но \n используется для send_user.

...