bash 和 Expect 在同一个脚本中?

bash 和 Expect 在同一个脚本中?

我正在尝试编写一个脚本,该脚本从 .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和分别设置$2Usernameuser。其中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"
...

相关内容