SCRIPT Expect - 等待一名高管的结束

时间:2017-01-26 11:43:28

标签: linux bash wait expect

我有一个期望脚本,必须启动一个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"之前脚本。 谢谢!

0 个答案:

没有答案