如何通过Telnet将Tcl数据结构传递给Perl?

问题描述:

我想远程登录到Cisco路由器,登录并执行本地存储在路由器闪存中的Tcl脚本。这个Tcl脚本会执行一些处理,并且应该返回一个嵌套的散列(首选)或代表XML文档的字符串。如何通过Telnet将Tcl数据结构传递给Perl?

有没有办法将Tcl嵌套散列映射到Perl嵌套散列,或返回表示XML文档的字符串? Expect是否允许我执行上述任何操作,以及如何操作?

+0

Expect是一个自动化命令行工具的工具;如果您已经在思科上编写了脚本,则可以使用expect登录并执行它。但是你必须自己写TCL脚本。 – 2011-04-16 15:15:17

+0

我担心的是,如果我可以将Tcl脚本的结果(嵌套散列或字符串)传递给Perl嵌套散列或持有字符串的变量。当然还有做后者的方式。 – user690182 2011-04-16 16:02:53

+0

“Tcl嵌套散列”?思科盒子里有什么版本的Tcl? – 2011-04-17 15:48:36

这个期望脚本应该将文件从路由器中取出并放在/tmp/xferfile.txt文件中。它需要使用实际生成文件的命令进行修改,因为我没有这些命令,所以我在脚本中留下了占位符。你应该可以使用Donal的代码。

自从我玩过expect和cisco IOS之后已经有一段时间了,所以请耐心等待,如果这需要在您的一端进行一些调试。

#!/usr/bin/expect 
set timeout 20 
set ip [lindex $argv 0] 
set user [lindex $argv 1] 
set password [lindex $argv 2] 
set prompt1 "Router>" 
set prompt2 "Router#" 
set prompt3 "bash\$" 
set ctrld [expr ("d" & 01xF)] 

spawn ssh "$user\@$ip" 
expect "Password:" 
send "$password\r"; 

# switch to privileged EXEC level 
expect $prompt1 { send "enable" } 

# ================================================== 
# Modify this line for your needs 
# ================================================== 
expect $prompt2 { send "command to print Tcl hash" } 

# Capture output to variable 
set results $expect_out(buffer) 

# leave EXEC level 
expect $prompt2 { send "exit" } 
# Command to log out of router 
expect $prompt1 { send "exit" } 

# Create text file on localhost 
spawn "#!/bin/bash" 
expect prompt3 { 
    send "cat > /tmp/xferfile.txt" 
    sleep 5 
    send $results 
    send $crtld 
    } 

expect prompt3 { send "exit" } 

将数据序列化成通用的交换格式,例如,一个JSON字符串。

有Tcl程序emit JSON。从Perl到Load the JSON到哈希。

+0

thanx daxim,有两个问题:我不认为cisco设备中可用的tcl shell已经安装了yeti,但我会去寻找它。第二,假设我们同意JSON格式,它看起来是一个好方法,我正在寻找的是如何通过telnet连接或使用expect来传递tcl变量(以json格式),换句话说,使用上述两个模块的API。 – user690182 2011-04-16 16:56:25

+0

你知道期望的工作吗? – 2011-04-17 04:11:29

+0

看来Albert Perrien你比我更了解,所以你能告诉我如何返回一个tcl嵌套散列(而不是一个使用log_user的字符串)来详细说明perl嵌套散列(命令等)? – user690182 2011-04-17 15:44:24

思科路由器倾向于运行老版本的Tcl,并且没有大量可用的扩展包。这意味着你在做什么时很受限制。幸运的是,对于生成可以被Perl收集和解析的数据的工作来说,它实际上非常简单。

让我们使用JSON作为交换格式。 (其他人也可以。)Daxim的答案告诉你如何解析JSON,但这很容易,因为你在可以控制的上下文中运行。如何在旧的Tcl中生成JSON数据?最简单的方法是使用subst命令 - 它在Tcl中已经在功能上保持不变,因此您已经明确了它 - 以及一些帮助程序命令。这里的轮廓:

proc getFoo {} { 
    # Some regular Tcl code to get the value 
} 
proc getFruit {variety} { 
    # Some regular Tcl code to get the value 
} 
set someIntValue [expr { 1 + 2 * 3 }] ;# Or whatever... 
set jsonTemplate { 
    { 
     "foo": [getFoo], 
     "bar": { 
      "pears": "[getFruit pears]", 
      "apples": "[getFruit apples]" 
     }, 
     "grill": $someIntValue 
    } 
} 
puts [subst $jsonTemplate] 

OK,警告时间:我不知道你想获得什么数据(“嵌套的哈希值”是不是很下去)。您必须在必要时添加引号/反斜线。把之前的程序拨打subst(Tcl事情的顺序)。