我正在尝试编写一个脚本,该脚本从 .csv 文件获取 IP 地址并通过 telnet 设备捕获“显示版本”命令输出。
到目前为止我已经编码了:
#!/bin/bash
#!/usr/bin/expect -f
FILE1=dispositivos.csv #file with IP's and device name
set Username "user" #this is the user for telnet connection.
set Password "this.is.the.pass" #pass for telnet connection.
NUMERODISP="$(wc -l $FILE1 | awk '{print $1}')" #this command counts number of devices (IP's) in the file as it is a .csv file, it only counts number of lines.
for i in `seq 2 $NUMERODISP`;
do
IP="$(awk -vnum="$i" 'NR == num { print $NF }' dispositivoss.csv)"
echo "$IP" #this takes the IP from last column from .csv file
done
我需要完成 for 循环,以便它通过 telnet 连接到存储在 $IP 的 IP 并保存“显示版本”输出。
我已经尝试过这个:
for i in `seq 2 $NUMERODISP`;
do
IP="$(awk -vnum="$i" 'NR == num { print $NF }' dispositivoss.csv)"
send "telnet $IP\r"
expect "Username:"
send "$Username\r"
expect "Password: "
send "$Password\r"
expect "*>"
send "show version\r"
log_file -noappend SN_$IP.dat;
expect -ex "--More--" {send -- " "; exp_continue}
expect "*>"
log_file;
done
但这没有用。
这是因为我无法使用 bash 并期望吗?
如果这就是原因..我如何将 $IP 和 $NUMDISP 作为变量发送到不同的期望脚本中? (这就是为什么我认为它与其他问题不同)
答案1
#!/bin/bash
#!/usr/bin/expect -f
嗯...不。
基本上,您希望两个程序都能读取您的脚本,并对每一行“做正确的事情”。除了在解释器之间同步脚本执行之间的问题之外,当我们有一行可能是任一语言的有效命令时,很容易看出这是不可能的。
在你的例子中考虑这样的事情。
set Username "user"
它实际上在 shell 和 Expect 脚本中都有效。在 shell 中,它将位置参数$1
和分别设置$2
为Username
和user
。其中expect
分配了其他东西。应该做哪一项呢?
要么将您的 Expect 脚本拆分到不同的文件并从 shell 脚本中调用它,要么利用 Expect 在 TCL 上运行的事实,这应该允许在其本身中执行循环和 IO。
幸运的是,在这种情况下,第二个代码块的 shell 循环中只包含一个 Expect 片段。
所以,制作一个shell脚本
#!/bin/bash
for i in `seq 2 $NUMERODISP`; do
IP="$(...)"
expect -f somename.expect $IP
done
以及从 shell 脚本调用的期望脚本:
#!/usr/bin/expect -f
set IP [lindex $argv 0];
spawn telnet $IP
expect "Username:"
send "$Username\r"
...