как вызвать телнет из проца с Tcl?

Где вывод 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, ожидать, взаимодействовать и т. д.


person Thufir    schedule 09.05.2020    source источник
comment
Не понятно, о чем вы спрашиваете. Не могли бы вы предоставить минимально воспроизводимый пример?   -  person    schedule 09.05.2020


Ответы (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
}

Тем не менее, вам, вероятно, лучше хранить идентификатор спавна (то есть результат вызова 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
}
person Donal Fellows    schedule 09.05.2020
comment
FWIW, я считаю, что руководство по ожиданиям довольно сложно читать в качестве справочного материала. Там спрятано много потенциально интересных кусочков, и их так легко пропустить, если вы не читаете очень внимательно! - person Donal Fellows; 09.05.2020
comment
Я смотрю на переключатель -i и spawn_id; не мог заставить эти части работать. - person Thufir; 10.05.2020