我有以下脚本通过cronjob每15天更新一个FTP密码,并在尝试完成后通过电子邮件发送相应的人员。它随机会失败,所以我会再次手动运行它,它会工作。我似乎无法找到它出错的地方。
脚本连接到本地mysql数据库,获取帐户的登录名和密码,然后在FTP上更改该密码。一切都成功,直到更改密码部分。再次它是随机的,有时它是有效的,有时它不会。
谢谢!
#!/usr/bin/perl -w
#
use DBI;
use Net::FTP;
our $dbh = DBI->connect('DBI:mysql:database:127.0.0.1','user','password') or die "Aargh $!\n";
$transquery=q{SELECT dest_login,dest_password FROM list where id=123};
$sth=$dbh->prepare($transquery);
$sth->execute();
while($co=$sth->fetchrow_hashref){
$login=$co->{'dest_login'};
$pass=$co->{'dest_password'};
}
$changeresult='FAIL';
$actionlog='';
$newstring='';
$upperchars='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$lowerchars='abcdefghijklmnopqrstuvwxyz';
$allowedchars='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#$';
$l=length($upperchars);
$newstring.=substr($upperchars,int(rand($l)),1);
$newstring.=substr($lowerchars,int(rand($l)),1);
$l=length($allowedchars);
for ($i=0;$i<6;$i++){
$newstring.=substr($allowedchars,int(rand($l)),1);
}
print "$newstring\n";
$actionlog .= "Setting Password for $login from $pass to $newstring\n";
$username=
eval{
$ftp=Net::FTP->new('x.x.x.x',Timeout=>480,Debug=>1) or die "Error connecting FTP $!\n";
$changepassword="$pass/$newstring/$newstring";
$ftp->login($login,$changepassword) or die "Error changing password $!\n";
#If we are here, time to update the password
$changeresult='SUCCESS';
$actionlog .= "Password successfully updated\n";
$transquery=q{UPDATE list set dest_password=(?) where id=123};
$sth=$dbh->prepare($transquery);
$sth->execute($newstring);
};
if ($@) {
$actionlog = $actionlog . "$@\n";
};
if($actionlog ne ""){
#print $actionlog;
#my $send_to = "To: someone\@example.com\n";
my $send_to = "To: databaseusers\@example.com\n";
my $sendmail = "/usr/sbin/sendmail -t";
open(SENDMAIL, "|$sendmail") or die "Cannot open $sendmail: $!";
print SENDMAIL "Reply-to: databasepassword\@example.com\n";
print SENDMAIL "Subject: Password Change Information [$changeresult]\n";
print SENDMAIL $send_to;
print SENDMAIL "Content-type: text/plain\n\n";
print SENDMAIL $send_to;
print SENDMAIL "Content-type: text/plain\n\n";
print SENDMAIL $actionlog;
close(SENDMAIL);
$actionlog='';
}
else{
#print "Nothing done this session\n";
答案 0 :(得分:1)
USUW可能会告诉你一些事情。 (use strict; use warnings;
)
有什么打印吗?
您在开始时没有在DBI部分中进行太多错误检查,可能是您遇到了连接错误。 AIX盒子曾经遇到过这样一个问题:获取一个客户端端口,系统不确定它是否在使用中。当发生这种情况时,它将无法连接到数据库。
我最后通过检查特定代码$OS_ERROR
(又名$!
),然后等待并重试,以指数衰减(等待)修复了我们脚本的问题2秒,然后4,然后8 ......)。
如果你的脚本“因某种原因而死”,那么脚本可以告诉你这个原因很重要。我将研究您正在使用的各种模块中的错误报告主题。
例如Net::FTP
允许您传递Errno::EADDRINUSE
开关,然后您将看到整个对话。
我知道Debug => 1
还有更多内容可以让您收到错误报告。