Bash:我无法在double while循环中运行eval命令

时间:2016-03-04 22:31:53

标签: linux bash shell expect

我的目标是让一个程序循环遍历两个文件,并使用file1和file2中所有行的组合来评估单独的shell脚本。我通过将它移出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 $username@<location>.com
expect "assword:"
send "$password\r"
interact

我已经确认上述脚本正常运行。但是,当我从while循环的子shell中调用它时,它会提示输入密码并且不会按预期放入密码。

如何修改我的第一个shell脚本,以便正确评估第二个shell脚本

1 个答案:

答案 0 :(得分:2)

问题是Expect脚本中的interact切换到从标准输入读取。由于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