Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash expect脚本中的循环操作_Bash_Expect - Fatal编程技术网

Bash expect脚本中的循环操作

Bash expect脚本中的循环操作,bash,expect,Bash,Expect,我有一个大约5k个用户的列表,我需要通过服务器程序的后端命令API来运行这些用户,以便检索帐户信息。现在我通过两个脚本来完成这项工作。第一个是bash脚本,它接受文件中的每一行并将数据提供给下一个脚本,即expect脚本。expect脚本然后将文件中的数据作为参数,并对命令API执行telnet以获取所需的数据。这很好,但出于效率的考虑,并且不必在我的服务器上打开5k telnet连接,有没有办法在expect脚本中的单个telnet操作中循环所有文件数据 Bash脚本: #!/bin/bas

我有一个大约5k个用户的列表,我需要通过服务器程序的后端命令API来运行这些用户,以便检索帐户信息。现在我通过两个脚本来完成这项工作。第一个是bash脚本,它接受文件中的每一行并将数据提供给下一个脚本,即expect脚本。expect脚本然后将文件中的数据作为参数,并对命令API执行telnet以获取所需的数据。这很好,但出于效率的考虑,并且不必在我的服务器上打开5k telnet连接,有没有办法在expect脚本中的单个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
我想要这样的东西:

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

如何使用expect执行此操作?

您可以从expect脚本执行此操作。如评论中所述,如果您有权为所有用户执行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"
}

当您以用户A身份登录时,您是否有权运行MYCOMMAND user_B?是的,假设您所说的“user_A”是授权tellnet会话的用户。MYCOMMAND user_B只是从while循环中的文件中引入的一个变量。这几乎可以正常工作。我必须改变的一件事是将“expect”200ok改为“expect”200data follow。下面是发生的事情。它执行动作,但每执行一个命令,它就会在输出上加倍。MYCOMMAND用户200数据跟随MYCOMMAND用户数据我想从第一个命令这里200数据跟随我想从第二个命令这里
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"
}