使用Expect脚本从文本文件中读取两列。

问题描述 投票:0回答:1

我需要在Expect上写一个脚本来读取一个包含两列的文本文件。第一列是站点名称(dns),第二列是一个路由器接口,当我从Cisco路由器执行FTP功能时,它将被用作源接口。下面是文本文件(myfile.txt)的内容。

site1   Gi0/0/0.44
site2   GigabitEthernet0/0
site3   GigabitEthernet0/0
site4   GigabitEthernet0/0/0
site5   GigabitEthernet0/0/0

这是我的代码 你会看到一个名为 "source-int "的变量,它还没有被定义。你会看到一个名为 "source-int "的变量,它还没有被定义,我只是把它放在脚本中作为一个占位符。

#!/usr/bin/expect
#
#
set workingdir cisco/rtr
puts stdout "Enter TACACS Username:"
gets stdin tacuserid
system stty -echo
puts stdout "Enter TACACS password:"
gets stdin tacpswd
puts stdout "\nEnter enable password:"
gets stdin enabpswd
system stty echo
#
set RTR [open "$workingdir/myfile.txt" r]
#
while {[gets $RTR dnsname] != -1} {
if {[ string range $dnsname 0 0 ] != "#"} {
        send_user "The value of the router name is $dnsname\n"
        set timeout 10
        set count 0
        log_file -a -noappend $workingdir/session_$dnsname\_$timestamp.log
        send_log "### /START-SSH-SESSION/ IP: $dnsname @ [exec date] ###\n"
        spawn ssh -o StrictHostKeyChecking=no -l $tacuserid $dnsname
expect -ex "TACACS Password: "
send "$tacpswd\r"
expect ">"
send "enable\r"
expect "assword: "
send "$enabpswd\r"
expect "#"
send "config t\r"
expect "#"
send "no ip ftp passive\r"
expect "#"
send "ip ftp username anonymous\r"
expect "#"
send "ip ftp source-interface $souce-int\r"
expect "#"
send "ip ftp password cisco\r"
expect "#"
send "end\r"
expect "#"
send "copy ftp://10.10.10.1/out/customer/ACL.txt flash:\r"
expect "\?"
send "\r"
expect "#"
send "end\r"
expect "#"
send "exit\r"
send_log "\n"
send_log "### /END-SSH-SESSION/ IP: $dnsname @ [exec date] ###\n"
log_file
sleep 5
        }
}
exit

任何帮助都是非常感激的。

variables multiple-columns expect
1个回答
0
投票

你可以使用tcl的 重型表达式 命令将这一行分割成两个字。

if {[regexp {(\S+)\s+(\S+)} "$dnsname" dummy dns interface] == 1} {
    puts "dns=$dns interface=$interface"
}

regexp代码 \s 匹配一个空格字符,并且 \S 一个非空格字符。的 + 后缀与前面的代码中的1个或多个匹配。该 () 捕获想要的部分,并通过命令将它们放入变量 dnsinterface.

© www.soinside.com 2019 - 2024. All rights reserved.