我正在使用Perl和Bash建立一些SSH连接。
现在,我有这个代码,它运行良好:
$exp->spawn("ssh -o ConnectTimeout=$connectTimeout $user\@$ip") or die ("unable to spawn \n");
@obj=$exp->expect( $commandTimeout,
[ qr/[Pp]assword:\s*/ => sub
{
my $exp = shift;
$exp->send($passwdused, "\n"); #ecriture du mot de pass routeur
$exp->send("term length 0", "\n");
$exp->expect($commandTimeout2,);
executeCommands();
}
],
[ qr/.*Are you sure you want to continue connecting.*/ => sub #si on voit "Are you sure you want to
{ #continue connecting" ecrit sur le routeur
my $exp = shift; #on execute la sous-fonction
$exp->send("yes\n");
exp_continue;
}
],
[ qr/.*refused.*/ => sub
{
my $exp = shift; #permet de renvoyer un message
print ERR_REPORT "insert into erreur(code_site,ip,operateur,cause) VALUES ('$ARGV[0]','$ARGV[1]','$ARGV[2]','Connexion ssh refusee');\n";
die ("Connexion refusee par l'hote distant\n"); #est refusee.
}
],
以下很多案例如"网络无法访问"或者" RSA公共解密失败"。
但我不是在检查密码是否正确(这有点令人尴尬,因为Perl会继续执行并尝试发送命令)。
我可以期待[ qr/ [Pp]assword: \s*/ => sub function ]
吗?
类似的东西:
@obj=$exp->expect( $commandTimeout,
[ qr/[Pp]assword:\s*/ => sub
{
@obj=$exp->expect( $commandTimeout,
[ qr/.*Permission.*denied.*/ => sub
{
#PRINT ERROR REPORT AND DIE HERE
}
]);
my $exp = shift;
$exp->send($passwdused, "\n"); #ecriture du mot de pass routeur
$exp->send("term length 0", "\n");
$exp->expect($commandTimeout2,);
executeCommands();
}
],