2016-03-04 74 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