2016-03-04 78 views
1

我的目標是讓程序循環兩個文件,並使用來自file1和file2的所有行的組合來評估單獨的shell腳本。我通過將它移出while循環來驗證我的eval線的工作原理。Bash:我無法在double while循環中運行eval命令

#!/bin/bash 
while read line1 
do 
    while read line2 
    do 
     eval "ssh_connect $line1 $line2" 
    done < $FILE2 
done < $FILE1 

ssh_connect根據命令行參數中提供的用戶名和密碼創建一個新的ssh連接。

set username [lindex $argv 0]; 
set password [lindex $argv 1]; 
puts "$password" 
puts "$username" 
spawn ssh [email protected]<location>.com 
expect "assword:" 
send "$password\r" 
interact 

我已驗證上述腳本正常工作。但是,當我從while循環的子shell中調用它時,它會提示輸入密碼,並且不會按預期方式進行設置。

如何修改我的第一個shell腳本,以便它評估第二個正確

+1

您確定需要使用'eval'嗎?這隻在文件包含需要解釋的shell語法時才需要。如果文件只包含用戶名和密碼,你應該可以執行'ssh_connect「$ line1」「$ line2」' – Barmar

+0

使用公鑰認證,而不是像這樣寫定製包裝來提供密碼。 – chepner

回答

2

的問題是,interact在Expect腳本切換到從標準輸入讀取。由於stdin在那時被重定向到$FILE2,它將讀取該文件中的所有內容。當內部循環重複時,文件中沒有任何內容,所以循環終止。

您需要保存腳本的原始標準輸入,並將ssh_connect的輸入重定向到該輸入。

#!/bin/bash 
exec 3<&0 # duplicate stdin on FD 3 
while read line1 
do 
    while read line2 
    do 
     eval "ssh_connect $line1 $line2" <&3 
    done < $FILE2 
done < $FILE1