使用expect脚本选择多个密码

时间:2017-07-21 16:25:30

标签: bash ftp expect

这是我的剧本:

set pwfl [open "/home/arul/Arul/BPGrep/Rest/Test/p1" r]
set pswd [split [read "$pwfl"] "\n"]
foreach pw \$pswd
log_file [exec date]_Int_Push_FTP.log
spawn ftp oc0151528004 21
set timeout 30
expect "Name (*:*):" {send "arul\r\n"}
expect "*assword:" {send "$pw\r\n"}
expect "ftp>" {send "bye\r\n"}
expect "ftp>" {send "exit\r\n"}

得到这样的错误:

  

错误#args:应该是“foreach varList list?varList list ...?   命令”       执行时

     

“foreach pw \ $ pswd”(文件“Int_Push_FTP_11Jul.expect”第4行)

1 个答案:

答案 0 :(得分:0)

解决您的紧急问题:

foreach pw $pswd {
    log_file ...
    ...
    expect "ftp>" {send "exit\r"}
    expect eof
}

您未向command

提供foreach参数

其他一些代码审核点:

  • 不要转义$pswd变量:这导致的不是列表内容,而是文字字符串
    $ P 取值 瓦特 d
  • 您只需要使用\r来"点击输入"在发送命令中,而不是\r\n
  • 这种读取文件行的​​方法将产生一个带有尾随空元素的列表。

    • 假设文件中的最后一个字符是换行符(如同任何表现良好的文本文件那样),那么
    • 当您在换行符上拆分文件内容时,尾随换行符后面的空字符串将成为最后一个列表元素。
    • 所以你得到一个额外的循环迭代,你尝试发送一个空密码。
    • 要克服这个问题,要么:

      set pswd [split [read -nonewline $pwfl] \n]
      

      while {[gets $pwfl pw] != -1} {
          # your foreach loop  body here
      }
      
  • 别忘了close $pwfl