bash,并期望在同一脚本中?


9

我正在尝试编写一个脚本,该脚本从.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作为变量发送到另一个Expect脚本中?(这就是为什么我认为它不同于另一个问题)


2
不要混用各种语言,expect可以读取CSV文件,就像我在unix.stackexchange.com/questions/350338/中所
thrig


@thrig OP显然不觉得这是一个骗子,因为他们只是问了这个问题。
terdon

我提出了两个问题,我认为这与其他问题有所不同。
Cesar Alejandro Villegas Yepez '17

Answers:


13
#!/bin/bash
#!/usr/bin/expect -f

嗯...不

基本上,您希望两个程序都读取您的脚本,并对每行“做正确的事”。除了使解释器之间的脚本执行同步化之间的问题外,很容易看出,当我们有一行可能是两种语言中的有效命令时,这是不可能的。

在您的示例中考虑类似这样的事情。

set Username "user" 

它实际上在Shell和Expect脚本中均有效。在外壳中,它分别将位置参数$1和设置$2Usernameuser。在expect其中分配其他内容。应该做哪一个?

将您的Expect脚本拆分到另一个文件中,然后从shell脚本中调用它,或者使用Expect在TCL上运行这一事实,它应该允许自己进行循环和IO。


幸运的是,在这种情况下,第二个代码块的shell循环中仅包含一个预期的片段。

因此,制作一个shell脚本

#!/bin/bash
for i in `seq 2 $NUMERODISP`; do
    IP="$(...)"
    expect -f somename.expect $IP
done

和一个期望脚本从外壳脚本中调用:

#!/usr/bin/expect -f 
set IP   [lindex $argv 0];
spawn telnet $IP
expect "Username:"
send "$Username\r"
...

1
@cesar,有一些方法可以将Expect脚本放入shell脚本中,但是总是在引用和变量周围感到头疼。这是最干净的方法。
格伦·杰克曼(Glenn Jackman)'17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.