Сохранить выходные данные предыдущей команды, выданной пользователем root, в переменной - PullRequest
0 голосов
/ 16 мая 2018

У меня есть удаленный компьютер, к которому я подключаюсь через ssh в ожидаемом сценарии.Я запускаю последовательные команды или сценарии на удаленной машине, и мне нужно знать, выходят ли они с ошибкой или нет.

Проблема: Я хочу сохранить состояние выхода предыдущего процесса в переменной.

Я знаю две вещи о проблеме:

  1. Мы можем узнать состояние завершения предыдущего процесса, выполнив команду echo $?
  2. . Я могу получить выходные данные последнего отправления, используя $expect_out(buffer)

, вот код:

spawn ssh $TARGET_USER@$TARGET_IP
expect "yes/no" {
    send "yes\r"
    expect "*?assword" { send "$TARGET_PASS\r"}
} "*?assword" { send "$TARGET_PASS\r"}

expect -re {\$ $}

# Delete start
send "su - root\r"
expect {
    "Password: " {send "$TARGET_PASS\r"}
}
# Delete end

send "sh /home/$TARGET_USER/xxx.sh\r"
expect -re {\$ $}

send "echo \$\?\r"; # '\r' used here to type 'return' .i.e new line
expect -re {\$ $}

set output $expect_out(buffer);
puts "------> $output <-------\n"

#logout from root
send "exit\r"
#logout from user
send "exit\r"
expect eof

Когда я выполняю приведенный выше код, он выводит:

------> su - root 
Password:  <-------

Если я удаляю фрагмент кода, который я упомянул в приведенном выше коде (т. Е. Больше не root), вывод будет похож наи это именно то, что я хочу:

------> echo $?
0 <-------

Итак, как мне добиться вывода последней команды, выданной root через $expect_out(buffer) в данном конкретном случае?

1 Ответ

0 голосов
/ 16 мая 2018

Согласно инструкции:

После сопоставления с шаблоном (или eof или full_buffer), любой совпадающий и ранее не сопоставленный выход сохраняется в переменной expect_out(buffer). В переменных expect_out(1,string) - expect_out(9,string) сохраняется до 9 совпадений подстрок регулярного выражения. 0 относится к строкам, которые соответствуют всему шаблону и генерируются для шаблонов glob, а также шаблонов регулярных выражений.

Так что вы можете использовать expect_out(N,string) (0 & le; N & le; 9).

Пример:

[STEP 101] # cat foo.exp
proc expect_prompt {} {
    upvar spawn_id spawn_id
    expect -re {bash-[.0-9]+[#$] $}
}

spawn bash --norc
expect_prompt

send "(exit 12)\r"
expect_prompt

send "echo \$?\r"
expect -re {[0-9]+}
set rcode $expect_out(0,string)
expect_prompt

send "echo 'Last command returned $rcode'\r"
expect_prompt

send "exit\r"
expect eof
[STEP 102] # expect foo.exp
spawn bash --norc
bash-4.4# (exit 12)
bash-4.4# echo $?
12
bash-4.4# echo 'Last command returned 12'
Last command returned 12
bash-4.4# exit
exit
[STEP 103] #
...