我正在尝试从主帐户到其他从帐户自动执行无密码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
答案 0 :(得分:0)
将exp_internal 1
添加到expect脚本以进行其他调试。我怀疑你可能需要改进你的期望:expect -re {password:\s*$}
如果您不需要实际与addSSH.ksh进行互动,请将interact
更改为expect eof
为什么您希望脚本的扩展名为“.ksh”?