0

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

环境.txt

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

运行.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 脚本时,我看到它没有第二次发送密码,而是从读取下一个 envenv.txt并退出。

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

account1@machine1's password: + read env
4

1 回答 1

0

添加exp_internal 1到期望脚本以进行额外的调试。我怀疑您可能需要完善您的期望:expect -re {password:\s*$}

如果您不需要实际与 addSSH.ksh 交互,请更改interactexpect eof

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

于 2013-07-15T10:26:23.677 回答