期望脚本不会以我设置为的代码退出

问题描述 投票:0回答:1

我曾尝试将其发布到codereview社区中,但没有期望标签,并且我没有足够的业力来创建标签。

我编写了一个期望脚本来登录服务器或运行简单(通常是单个)命令并返回输出。

我有两个问题和一个愿望。

  • 不返回任何内容(即ssh2server user host false的命令)因错误而超时(因为我没有捕获超时,尽管我想应该这样做),而不是不返回任何内容。
  • 我可以捕获程序的返回代码,但无法获得包含相应代码的退出代码。
  • 有没有一种方法可以获取被调用程序的输出并以相同的方式返回它(远程标准输出转到本地标准输出,远程标准输出转到本地标准输出?]

此外,任何评论或(建设性的)批评将不胜感激。

 #!/usr/bin/expect -f

 if {[info exists ::env(SSH2SERVER_PASSWORD)]} {
   set password "$env(SSH2SERVER_PASSWORD)"

 } else {
   puts "SSH2SERVER_PASSWORD not set"
   exit 1
 }

 if {[llength $argv] < 2} {
   puts "usage: ssh2server user server"
   exit 1
 }

 set user    [lindex $argv 0]
 set server  [lindex $argv 1]
 set command [lrange $argv 2 end]

 set pwd_prompt "*assword:"
 set prompt "\$ "

 set rc 0

 expect_before {
   #timeout { send_user 'timeout' ; exit 2 }
   timeout { send_user 'timeout' ; set rc 2}
 }

 log_user 0
 spawn ssh $user@$server
 expect "$pwd_prompt" { send -- "$password\r" }

 if { $command == "" } {
   interact

 } else {
   expect {
     "$prompt" {
       send -- "PROMPT_COMMAND=\rPS1='_MYPROMPT_'\r$command\r"
       #expect -re "$command\r\n(.*)\r\n\[^\r]*\[#\$%]"
       expect -re "$command\r\n(.*)\r\n\[^\r]*_MYPROMPT_"
       set results $expect_out(1,string)
       puts $results
       send -- "^D"
       expect eof
       #catch wait ec
       #set rc [lindex $ec 3]
       #puts [lindex $ec 3]
       #exit [lindex $ec 3]
     }

     #eof { send_user $expect_out(buffer); exit 3}
     eof { send_user $expect_out(buffer); set rc 3}
   }
 }

 log_user 1

 lassign [wait] pid spawnid os_flag rc
 #puts $rc # outputs correct value
 exit $rc
expect
1个回答
0
投票

我怀疑这是问题所在:

       send -- "^D"

您不发送Ctrl-D,而是发送字符^D

发送Ctrl-D

       send -- "\04"
© www.soinside.com 2019 - 2024. All rights reserved.