在shell脚本的while循环中调用expect脚本

时间:2013-07-15 06:58:39

标签: expect

我正在尝试从主帐户到其他从帐户自动执行无密码ssh设置。我有一个名为AddSSH.ksh的脚本执行此设置。当手动运行此脚本时,它会同时请求相同的密码,它基本上使用scp复制了密钥。所有从属帐户都保存在文件env.txt中。所以现在,我有一个shell脚本(run.ksh),它逐个读取此文件(env.txt)中的帐户,然后使用expect脚本auto_ssh.ksh来处理交互,并相应地输入密码。

env.txt

account1@machine1
account2@machine2
account3@machine3
account4@machine4

run.ksh

#!/usr/bin/ksh

while read env
do

username=`echo $env | cut -d"@" -f1`;
hostname=`echo $env | cut -d"@" -f2`;
password='Unix_11'
ssh -n -o PasswordAuthentication=no ${env} ' ' 2>/dev/null
if [ $? -eq 0 ]; then
        printf "\nConnection OK for : $env \n"
else
        expect auto_ssh.ksh $username $hostname $password
fi
done<env.txt

auto_ssh.ksh

#!expect
set timeout 6
set user [lindex $argv 0]
set machine [lindex $argv 1]
set password [lindex $argv 2]
spawn AddSSH.ksh $user $machine
expect "password:"
send "$password\r";
expect "password:"
send "$password\r";
interact

如果运行脚本auto_ssh.ksh喜欢

./auto_ssh.ksh account1 machine1 password

它运行正常但是当我在shell脚本中调用它时,这个期望脚本会在第二个密码退出。当我在调试模式下运行shell脚本时,我看到它不会在第二次移动到读取时发送密码来自env.txt的下一个环境并退出。

这是调试模式下输出失败的行。

account1@machine1's password: + read env

1 个答案:

答案 0 :(得分:0)

exp_internal 1添加到expect脚本以进行其他调试。我怀疑你可能需要改进你的期望:expect -re {password:\s*$}

如果您不需要实际与addSSH.ksh进行互动,请将interact更改为expect eof

为什么您希望脚本的扩展名为“.ksh”?