将root用户发出的上一个命令的输出存储在变量中

时间:2018-05-16 12:12:26

标签: shell expect

我有一台远程计算机,我在期望脚本中通过 ssh 连接。我在远程计算机上运行顺序命令或脚本,我需要知道它们是否因错误而退出。

问题:我想将先前流程的退出状态存储在变量中。

我知道有关这个问题的两件事:

  1. 我们可以通过发出echo $?命令
  2. 来了解先前流程的退出状态
  3. 我可以使用$expect_out(buffer)
  4. 检索上一次发送的输出

    这是代码:

    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发出的最后一个命令的输出?

1 个答案:

答案 0 :(得分:1)

根据手册:

  

匹配模式(或eoffull_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] #