我有一个期望脚本,必须启动一个ssh会话并期待它的结果。
当它引发RSA密钥错误时,它必须调用bash脚本,该脚本必须擦除文件的一行并再次调用脚本以再次测试ssh连接。
但是,这个脚本也是从bash脚本启动了一定次数。 (文件中的IP数量)
> bash ssh_bash.sh ipfile.txt cmdfile.txt user pwd
这是我的代码:
[ssh_bash.sh]
#!/bin/bash
row=$(cat $1 | wc -l)
modulus=$(($row%$4))
declare -A tab
declare -A tabthread
for rows in $(cat $1);do
tab[$compt]=$rows
compt=`expr $compt + 1`
done
tabthread[0]="LOGG/_ssh-1-"`date +%Y%m%d%H%M`".temp"
compt=0
for k in `seq 0 $(($modulus-1))`;do
./ssh_bash.expect ${tab[$compt]} $2 ${tabthread[0]} $3 $4 &
compt=`expr $compt + 1`
wait
done
fi
#sleep 5
touch $log
for logfiles in "${tabthread[@]}";do
cat $logfiles >> $log
rm -f $logfiles
compt=`expr $compt + 1`
done
echo "Process finished!"
[ssh_bash.expect]
#!/usr/bin/expect -f
set ip [lindex $argv 0];
set cmdfile [lindex $argv 1];
set log [lindex $argv 2];
set _user [lindex $argv 3];
set _pwd [lindex $argv 4];
set _timeout 0
set _issue 0
log_file $log
log_user 0
spawn ssh -o ConnectTimeout=5 $_user@$ip
expect {
"assword" { send "$_pwd\r" }
"yes/no" { send "yes\r"
exp_continue }
"port 22: Connection timed out" { set _timeout 1 }
"verification failed" { exec bash rsa_eraser.sh ${ip} ${cmdfile} ${log} ${_user} ${_pwd} &
wait
set _issue 1 }
}
if {$_timeout == 0 && $_issue == 0} {
send "$cmd\r"
expect {
"OK" { puts "$ip | $cmd : OK" }
"ERROR" { puts "$ip | $cmd : ERROR"
set _error 1 }
}
}
[rsa_eraser.sh]
#!/bin/bash
cp -f /root/.ssh/known_hosts /root/.ssh/known_hosts.back
ligne=`grep -n $1 "/root/.ssh/known_hosts" | cut -d: -f1`
sed -i "$ligne d" "/root/.ssh/known_hosts"
echo "Erasing existing RSA...done!"
./ssh_bash.expect $1 $2 $3 $4 $5
例如,ipfile上只有一个IP。 所以,
for k in `seq 0 $(($modulus-1))`;do
./ssh_bash.expect ${tab[$compt]} $2 ${tabthread[0]} $3 $4 &
compt=`expr $compt + 1`
wait
done
仅循环一次。 但是如果RSA错误引发,脚本就不会等到结束:
./ssh_bash.expect $1 $2 $3 $4 $5
的rsa_eraser.sh脚本。
我找到解决这个问题的唯一方法是放置一个"睡眠5"就在登录" ssh_bash.sh"之前脚本。 谢谢!