如何通过Telnet将Tcl数据结构传递给Perl?
我想远程登录到Cisco路由器,登录并执行本地存储在路由器闪存中的Tcl脚本。这个Tcl脚本会执行一些处理,并且应该返回一个嵌套的散列(首选)或代表XML文档的字符串。如何通过Telnet将Tcl数据结构传递给Perl?
有没有办法将Tcl嵌套散列映射到Perl嵌套散列,或返回表示XML文档的字符串? Expect是否允许我执行上述任何操作,以及如何操作?
这个期望脚本应该将文件从路由器中取出并放在/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到哈希。
thanx daxim,有两个问题:我不认为cisco设备中可用的tcl shell已经安装了yeti,但我会去寻找它。第二,假设我们同意JSON格式,它看起来是一个好方法,我正在寻找的是如何通过telnet连接或使用expect来传递tcl变量(以json格式),换句话说,使用上述两个模块的API。 – user690182 2011-04-16 16:56:25
你知道期望的工作吗? – 2011-04-17 04:11:29
看来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事情的顺序)。
Expect是一个自动化命令行工具的工具;如果您已经在思科上编写了脚本,则可以使用expect登录并执行它。但是你必须自己写TCL脚本。 – 2011-04-16 15:15:17
我担心的是,如果我可以将Tcl脚本的结果(嵌套散列或字符串)传递给Perl嵌套散列或持有字符串的变量。当然还有做后者的方式。 – user690182 2011-04-16 16:02:53
“Tcl嵌套散列”?思科盒子里有什么版本的Tcl? – 2011-04-17 15:48:36