我有一台远程计算机,我在期望脚本中通过 ssh 连接。我在远程计算机上运行顺序命令或脚本,我需要知道它们是否因错误而退出。
问题:我想将先前流程的退出状态存储在变量中。
我知道有关这个问题的两件事:
echo $?
命令$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: <-------
如果我删除了上面代码中提到的那段代码(即没有更多 输出如下所示,它正是我想要的:
------> echo $?
0 <-------
那么,在这种特殊情况下,如何通过$expect_out(buffer)
实现root发出的最后一个命令的输出?
答案 0 :(得分:1)
根据手册:
匹配模式(或
eof
或full_buffer
)后,任何匹配和以前不匹配的输出都会保存在变量expect_out(buffer)
中。最多9
个regexp子字符串匹配项保存在变量expect_out(1,string)
到expect_out(9,string)
中。0
指的是与整个模式匹配的字符串,它是为glob模式和regexp模式生成的。
所以你可以使用expect_out(N,string)
(0≤N≤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] #