【问题标题】:how to spawn telnet from a proc with Tcl?如何使用 Tcl 从 proc 中生成 telnet?
【发布时间】:2020-08-24 15:48:11
【问题描述】:

telnet 输出在哪里?

thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ 
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ tclsh main.tcl 
spawn telnet rainmaker.wunderground.com
getting weather for nyc
^C
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ 

主要:

lappend auto_path /home/thufir/NetBeansProjects/spawnTelnet/telnet/api

package require weather 1.0


tutstack::connect "nyc"

代码:

package provide weather  1.0
package require Tcl      8.5
package require Expect

namespace eval ::tutstack {
}

proc ::tutstack::parse {city} {
puts "getting weather for $city"
expect -nocase "Press Return to continue:"
#interact \004 return
interact \004 return
}

proc ::tutstack::connect {city} {
spawn telnet rainmaker.wunderground.com
set telnet $spawn_id
#interact
parse $city
}

这行得通:

thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ 
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ tclsh chainedProcs.tcl 
hello Alice from first
hello Alice from second
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ 
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ cat chainedProcs.tcl 
lappend auto_path /home/thufir/NetBeansProjects/spawnTelnet/telnet/chained

package require chained 1.0

example::first "Alice"
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ 
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ cat chained/chained.tcl 
package provide chained  1.0

namespace eval ::example {
}

proc ::example::first {foo} {
puts "hello $foo from first"
second $foo
}

proc ::example::second {bar} {
puts "hello $bar from second"
}
thufir@dur:~/NetBeansProjects/spawnTelnet/telnet$ 

但是...不在那里使用 telnet。我正在寻找“链接”(?)一个序列,但使用 telnet、expect、interact 等。

【问题讨论】:

标签: automation tcl expect telnet proc


【解决方案1】:

当您在过程中使用 Expect 包的命令时,您需要小心,因为它访问变量的方式。特别是,您可能至少需要说:

global spawn_id

在每个程序中。可能是这样的:

proc ::tutstack::parse {city} {
    global spawn_id
    puts "getting weather for $city"
    expect -nocase "Press Return to continue:"
    # You *might* need inter_return instead of return; the documentation isn't clear
    interact "\004" return
}

proc ::tutstack::connect {city} {
    global spawn_id
    spawn telnet rainmaker.wunderground.com
    set telnet $spawn_id
    parse $city
}

但是,您最好将生成 ID(即,调用 spawn 的结果)保留在命名空间变量中,并通过 -i 标志将其显式传递给相关命令,如下所示:

proc ::tutstack::connect {city} {
    variable telnet [spawn telnet rainmaker.wunderground.com]
    parse $city
}

proc ::tutstack::parse {city} {
    variable telnet
    puts "getting weather for $city"
    expect -i $telnet -nocase "Press Return to continue:"
    # You *might* need inter_return instead of return; the documentation isn't clear
    interact -i $telnet "\004" return
}

【讨论】:

  • FWIW,我发现期望手册作为参考材料非常难以阅读。里面隐藏着很多可能有趣的点点滴滴,除非你仔细阅读,否则很容易错过它们!
  • 我正在研究-i 开关和spawn_id;无法让这些部分正常工作。
猜你喜欢
  • 2010-12-17
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
相关资源
最近更新 更多