LINUX.ORG.RU

[Expect] получить exit code команды


0

1

Приветствую,

Есть expect-скрипт, вызываемый из баш-скрипта. Expect делает spawn удаленной ssh-сессии и выполняет удаленную команду. Мне необходимо получить результат выполнения той команды, т.е. то что возвращается по «exit $?».

Вот сами скриптики и некоторый костыль, который делает то что мне нужно, но IMHO должно быть более красивое решение и кроме того, я бы хотел обрабатывать exit code в шелл-скрипте:

# !/bin/sh
expect -f remote.exp 192.168.1.100 user pass 10.10.10.1
#!/usr/bin/expect

set timeout 20
set box [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
set target [lindex $argv 3]

spawn ssh -l $user $box

expect "*password:"
send "$password\r\n"

expect "*#"
send "ping -c1 $target\r\n"
expect "*#"

send "echo $?\r"
expect {
  "0\r" { puts "Test passed."; }
  timeout { puts "Test failed."; }
}

expect "*#"

Буду признатален за советы! Спасибо.


должно быть catch { close $spawn_id } подойдёт. (может ещё пригодится leaveopen при открытии, но не помню)

хотя никто не говорил, что exit_code('ssh command') := exit_code('command'). Короче говоря ssh может вернуть свою собственную ошибку, а не код из вызванного приложения. И таким образом описанный вами костыль заиграет новым велосипедным блеском. (то есть так к сожалению и делается обычно)

MKuznetsov ★★★★★ ()

заюзайте уже ключи

$ ssh root@bla 'ping -c1 ya.ru'; echo $?
Enter passphrase for key: 
PING ya.ru (87.250.251.3) 56(84) bytes of data.
64 bytes from www.yandex.ru (87.250.251.3): icmp_seq=1 ttl=55 time=14.6 ms

--- ya.ru ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 14.643/14.643/14.643/0.000 ms
0

$ ssh root@bla 'ping -c1 yadflkjsdfkljs.ru'; echo $?
Enter passphrase for key: 
ping: unknown host yadflkjsdfkljs.ru
2

я кстати склоняюсь к мнению, что лучше curl'ом проверять например google.com, чем пинговать шлюзы.

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