【问题标题】:loop operation inside expect script期望脚本内的循环操作
【发布时间】:2017-10-05 18:10:13
【问题描述】:

我有一个大约 5 k 用户的列表,我需要通过服务器程序的后端命令 API 运行这些用户以检索帐户信息。现在我正在通过 2 个脚本执行此操作。第一个是 bash 脚本,它获取文件中的每一行并将数据提供给下一个脚本,这是一个期望脚本。然后,expect 脚本将文件中的数据作为参数,并对命令 API 执行 telnet 以获取我需要的数据。这很好用,但是本着效率的精神,并且不必在我的服务器上打开 5k telnet 连接,有没有办法在期望脚本内的单个 telnet 操作中循环所有文件数据?

Bash 脚本:

 #!/bin/bash

 exp="/path_to_expect_script"
 file="/path_to_data_file"


 while read -r user; do
 $exp "$user" </dev/tty

 echo

 done < $file

期望脚本:

#!/usr/bin/expect -f

lassign $argv user

spawn telnet 127.0.0.1 825
expect "200 PWD Server ready"
send "USER username\r"
expect "300 please send the PASS"
send "PASS password\r"
expect "200 login OK, proceed"
### Line below does the work ####
send "MYCOMMAND $user\r"
expect "200 OK"
send "quit\r"
interact

我想要这样的东西:

send "MYCOMMAND $user\r"
expect "200 OK"
send "MYCOMMAND $user\r"
expect "200 OK"
send "MYCOMMAND $user\r"
expect "200 OK"
etc..

我怎样才能用期望做到这一点?

【问题讨论】:

  • 当您以 user_A 身份登录时,您是否有权运行 MYCOMMAND user_B
  • 是的,假设您正在谈论“user_A”是对 tellnet 会话进行身份验证的用户。 MYCOMMAND user_B 只是一个在 while 循环中从文件中引入的变量。

标签: bash expect


【解决方案1】:

您可以从期望脚本中执行此操作。如评论中所述,如果您有权为所有用户执行 MYCOMMAND。

spawn telnet 127.0.0.1 825
expect "200 PWD Server ready"
send "ROOT username\r"
expect "300 please send the PASS"
send "ROOT password\r"
expect "200 login OK, proceed"

set fp [open $file r]
while { [gets $fp user] >= 0 } {  #; Assuming file just contains user names
    send "MYCOMMAND $user\r"
    expect "200 OK"
}

close $fp
send "quit\r"
interact

否则你可以尝试通过如下修改while循环以新用户身份登录

while { [gets $fp user] >= 0 } { 
    send "su $user\r"
    expect "300 please send the PASS"
    send "PASS password\r"
    send "MYCOMMAND $user\r"
    expect "200 OK"
}

【讨论】:

  • 几乎有效。我必须改变的一件事是“期望”200 好“到”期望“200 数据跟随”。这是正在发生的事情。它执行该操作,但每个其他命令都会在输出上加倍。 MYCOMMAND 用户 200 个数据跟随我想要的第一个命令的 MYCOMMAND 用户数据 200 个数据跟随我想要的第二个命令的数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 2022-05-17
相关资源
最近更新 更多