bash 和 expect 在同一个脚本中?

Ces*_*pez 9 scripting bash shell-script expect

我正在尝试编写一个脚本,该脚本从 .csv 文件中获取 IP 地址并远程登录设备以捕获“显示版本”命令输出。

到目前为止,我已经编码了这个:

#!/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    
Run Code Online (Sandbox Code Playgroud)

我需要完成 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    
Run Code Online (Sandbox Code Playgroud)

但它没有用。

这是因为我不能使用 bash 并期望吗?

如果这就是原因.. 我怎样才能将 $IP 和 $NUMDISP 作为变量发送到不同的期望脚本中?(这就是为什么我认为它与其他问题不同)

ilk*_*chu 14

#!/bin/bash
#!/usr/bin/expect -f
Run Code Online (Sandbox Code Playgroud)

嗯……没有。

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

在你的例子中考虑这样的事情。

set Username "user" 
Run Code Online (Sandbox Code Playgroud)

它实际上在 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
Run Code Online (Sandbox Code Playgroud)

和一个从 shell 脚本调用的期望脚本:

#!/usr/bin/expect -f 
set IP   [lindex $argv 0];
spawn telnet $IP
expect "Username:"
send "$Username\r"
...
Run Code Online (Sandbox Code Playgroud)