【问题标题】:tcl script in GNS3 .... wrong # args: should be "foreach varList list ?varList list ...? command"GNS3 中的 tcl 脚本 .... 错误 # args: 应该是“foreach varList list ?varList list ...? command”
【发布时间】:2014-01-29 23:02:53
【问题描述】:

我正在尝试在 GNS3 中的 Cisco 路由器上运行 tcl 脚本;

SanJose1(tcl)#foreach address {
+>192.168.1.1
+>192.168.1.2
+>172.16.224.5
+>172.16.224.6
+>192.168.72.1
+>172.16.224.2
+>172.16.224.1
+>10.2.1.1
+>10.2.2.1
+>} { ping $address }

当我这样做时,什么都没有发生,没有 ping,没有错误,它只是返回到路由器提示符。 我是否错误地运行代码?如果它是正确的,那么我可以研究 GNS3 的问题

谢谢!

【问题讨论】:

    标签: networking tcl cisco cisco-ios


    【解决方案1】:

    foreach,正如您在问题中所写,看起来是正确的。 (如果还有一个参数,你会从问题标题中得到消息,但你的代码示例不应该生成那个。)你调用的 ping 更有可能没有写任何可见的东西,而是只是将结果生成为字符串。这在 Tcl 代码中很常见。假设我的诊断是正确的,我希望这样的事情能够奏效:

    foreach address {
        192.168.1.1
        192.168.1.2
        172.16.224.5
        172.16.224.6
        192.168.72.1
        172.16.224.2
        172.16.224.1
        10.2.1.1
        10.2.2.1
    } {
        puts [ping $address]
    }
    

    为了清楚起见,我省略了提示并添加了缩进和一些换行符。如果ping 确实是一个外部命令,请改用exec ping $address(依赖未知命令处理将外部命令引入代码被认为是一种不好的形式,尤其是在脚本模式下它被禁用时。)使用外部命令,您可能还想通过一个数字传递-c 选项,以便将使用的请求数限制为一个相当小的数字,也许:

    puts [exec ping -c 5 $address]
    

    请注意,Tcl 解释器支持的命令集可以完全(通过设计)进行更改,并且文档中列出的命令实际上只是预先提供的标准库。当 Tcl 嵌入到像路由器这样的环境中时,很可能事情已经发生了相当大的变化。 (对于路由器供应商来说,这并不难。)这意味着肯定会发生命令中的惊人差异,并且您应该检查您拥有的文档并稍微考虑一下,而不是盲目地相信什么我写的。

    【讨论】:

    • 唐纳,谢谢!!看起来你是对的,添加 'puts' 命令使 ping 结果显示出来。我对编码很陌生(非常),所以我不完全理解为什么,或者你提到的一切,但我会努力的。现在,你肯定帮助了我的网络研究。对此,我真的非常感激!罗伯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多