【问题标题】:Expect Loop to run a command from a text file期望循环从文本文件运行命令
【发布时间】:2014-06-11 11:53:17
【问题描述】:

我正在尝试编写一个期望循环,它查看文本文件中的主机列表,然后从另一个以主机 IP 和文件 extension.txt 命名的文本文件运行一系列命令

例如在 hosts.txt 文件中,我将定义以下主机:

192.168.1.1
192.168.3.1
192.168.2.197

等等。

在另一个目录中,我将拥有如下命名的文件,其中包含我想在每个主机上运行的一组不同的命令:

192.168.1.1.txt 192.168.3.1.txt 192.168.2.197.txt

因此,如果主机 192.168.1.1 存在于 hosts.txt 中,它会针对该主机运行 192.168.1.1.txt 中的命令。实现这一目标最简单的工具是什么?

【问题讨论】:

    标签: ubuntu tcl expect


    【解决方案1】:

    我不是 100% 确定,但部分的解决方案是:

    # Read-a-file helper procedure
    proc readFile {filename} {
        set f [open $filename]
        set content [read $f]
        close $f
        return $content
    }
    
    foreach host [split [readFile hosts.txt] "\n"] {
        if {[catch { set commands [readFile $host.txt] }]} continue
        spawn ssh $host
        # ... handle connecting ...
        # get a prompt ...
        expect -ex "$ "
        foreach line [split $commands "\n"] {
            send $line\r
            # Get the prompt
            expect -ex "$ "
        }
        send "exit\r"
        expect eof
        close
    }
    

    这将为您提供主机和针对该主机运行的命令,跳过不存在的文件,然后将每个文件的每一行发送到各自的主机,并排除连接的设置和拆除。我已经跳过了诸如如何处理密码之类的事情,而且还有很多我不是 100% 确定的(我不是普通的 Expect 用户,所以 expect eof/close 可能是错误的)。它应该看起来很相似。

    您可能会考虑将命令文件设置为(部分)期望脚本,您只是 source。在这段代码中会更简单一些(代价是要求这些文件更复杂一些)。

    【讨论】:

    • 所以我实际上想要做的是通过 ssh 连接到 Cisco 设备,运行另一个文本文件中的 Cisco 命令,然后转到下一个设备。因此,当脚本 ssh 进入 192.168.1.1 时,它将运行 192.168.1.1.txt,然后转到下一个设备。澄清一下,在proc readfile {filename} 期间,我的“文件名”会是hosts.txt 吗? @Donal
    • 使用 that 作为参数调用时会是 hosts.txt,然后使用 that 作为参数调用时会是 192.168.1.1.txt
    • @bjforesthowell 我已经扩展了我的答案以涵盖您可能需要的更多内容。它可能仍然需要工作才能让它做你真正想要的,但它应该很接近。
    猜你喜欢
    • 2014-07-31
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多