Tcl/Tk:在愿望脚本中嵌入expect发送脚本

Tcl/Tk:在愿望脚本中嵌入expect发送脚本,tcl,tk,Tcl,Tk,我有一个愿望脚本,将做产卵,期望和发送,并获得所需的数据。 当我以wish ex.tcl运行脚本时,它不起作用 请查找下面的代码以了解更多信息 #!/usr/bin/wish package require Expect proc openSession { targetHost } { log_user 1 set user $::env(USER) set password "tmp1234" set timeout 60 set spawn_i

我有一个愿望脚本,将做产卵,期望和发送,并获得所需的数据。 当我以wish ex.tcl运行脚本时,它不起作用

请查找下面的代码以了解更多信息

#!/usr/bin/wish

package require Expect

proc openSession { targetHost } {
    log_user 1

    set user $::env(USER)
    set password "tmp1234"
    set timeout 60
    set spawn_id ""

    puts "Ssh to $user@$targetHost"
    spawn ssh -o UserKnownHostsFile=/dev/null $user@$targetHost
    match_max -i $spawn_id 99999
    expect {
        "\(yes\/no\)\? " { send "yes\r" ; exp_continue }
        "password\:" { puts 2 ; send "$password\r" ; exp_continue }
        "$ " { puts 3 ; send "\r" ; puts "Ssh Session ready" }
        timeout { puts 4 ; set spawn_id "" ; puts "Timeout during ssh $targetHost" }
    }
    set timeout 10
    return $spawn_id
}

proc closeSession { sshSess args } {
    puts "Closing Ssh session..."
    expect -i $sshSess "$ " { send -i $sshSess "exit\r" }
    expect -i $sshSess "closed." { puts "Connection Closed" }
    catch { exp_close -i $sshSess }
    catch { exp_wait -i $sshSess }
    return
}


set sessId [openSession testbng76]
grid [ttk::button .mybutton -text Mytext]
closeSession $sessId
出现错误:

Are you sure you want to continue connecting (yes/no)? Error in startup script: wrong # args: should be "send ?options? interpName arg ?arg ...?"
    while executing
"send "yes\r" "
    invoked from within
"expect {
        "\(yes\/no\)\? " { send "yes\r" ; exp_continue }
        "password\:" { puts 2 ; send "$password\r" ; exp_continue }
        "$ " { p..."
    (procedure "openSession" line 12)
    invoked from within
"openSession testbng76"
    invoked from within
"set sessId [openSession testbng76]"
    (file "./log.tcl" line 36)
如何使用tk生成远程会话并获得所需的输出?

tk还有一个发送命令,用于与其他启用tk的解释器进行对话。它的工作方式与预期完全不同,并且两者相互作用。或者更确切地说,Expect在看到Tk时会后退,并且不会创建send命令

幸运的是,您可以使用exp\u send;它是您想要的功能的另一个名称,Expect总是创建它。例如:

    "\(yes\/no\)\? " { exp_send "yes\r" ; exp_continue }
Tk还有一个send命令,用于与其他启用Tk的口译员进行对话,它的工作方式与预期完全不同,并且两者相互作用。或者更确切地说,Expect在看到Tk时会后退,并且不会创建send命令

幸运的是,您可以使用exp\u send;它是您想要的功能的另一个名称,Expect总是创建它。例如:

    "\(yes\/no\)\? " { exp_send "yes\r" ; exp_continue }

这样做是因为Expect和Tk都早于Tcl的名称空间支持。这样做是因为Expect和Tk早于Tcl的名称空间支持。很好地保留了spawn_id。您还可以在openSession和Closession过程中将该变量声明为全局变量。很好地保留了spawn_id。您还可以声明它变量在openSession和closeSession过程中为全局变量。