ubuntu - 期望循环从文本文件运行命令

标签 ubuntu tcl expect

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

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

192.168.1.1
192.168.3.1
192.168.2.197

ETC..

在另一个目录中,我将拥有如下命名的文件,其中包含我想在每个主机上运行的一组不同的命令:
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.1.txt 中的命令。为了实现这一目标,最简单的工具是什么?

最佳答案

我不是 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 .在这段代码中会更简单一些(代价是要求这些文件更复杂一些)。

关于ubuntu - 期望循环从文本文件运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24162283/

相关文章:

list - Tcl 在使用 `$` 符号时添加花括号

bash - apt-get install tzdata 非交互式

ubuntu - 如何在 ubuntu 12.04 中安装 glibc 2.12?

ubuntu - Netbeans使用哪个jdk

python - mapnik 标记并不总是出现

linux - 运行 Bash 脚本,后跟关键字或变量

tcl - tcl中广度优先搜索的实现

regex - Tcl:如何在多行字符串中有条件地替换

bash - 如何在 Bash 脚本中使用 Expect

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