2017-05-07 58 views
0

我有一個約5k用戶的列表,我需要通過服務器程序的後端命令API運行以檢索帳戶信息。現在我正在通過2個腳本來完成這個任務。第一個是一個bash腳本,它將文件中的每一行都輸入到下一個腳本中,這是一個期望腳本。期望腳本然後將文件中的數據作爲參數,並執行telnet到命令API以獲取我需要的數據。這工作正常,但本着效率的精神,而不必在我的服務器上打開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 

expect腳本:

#!/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.. 

我如何能做到這一點與期望?

+1

登錄新用戶,你有特權運行* mycommand的用戶_B *當你登錄爲*用戶_A *? – pynexj

+0

是的,假設你正在談論的是「user_A」是授權給tellnet會話的用戶。 MYCOMMAND user_B只是一個從while循環中的文件中引入的變量。 – user53029

回答

0

您可以通過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" 
} 
+0

這*幾乎*的作品。我必須改變的一件事是「期望」200確定「到」預計「200個數據」。這是發生了什麼。它執行這個動作,但是其他所有命令都會在輸出上加倍。 MYCOMMAND用戶 200數據關注 MYCOMMAND用戶 我想從這裏的第一個命令獲得的數據 200個數據跟隨 我想從第二個命令獲得的數據 – user53029