脚本更改FTP密码

时间:2010-06-25 14:55:16

标签: mysql linux perl ftp debian

我有以下脚本通过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";

1 个答案:

答案 0 :(得分:1)

USUW可能会告诉你一些事情。 (use strict; use warnings;

有什么打印吗?

您在开始时没有在DBI部分中进行太多错误检查,可能是您遇到了连接错误。 AIX盒子曾经遇到过这样一个问题:获取一个客户端端口,系统不确定它是否在使用中。当发生这种情况时,它将无法连接到数据库。

我最后通过检查特定代码$OS_ERROR(又名$!),然后等待并重试,以指数衰减(等待)修复了我们脚本的问题2秒,然后4,然后8 ......)。

如果你的脚本“因某种原因而死”,那么脚本可以告诉你这个原因很重要。我将研究您正在使用的各种模块中的错误报告主题。

例如Net::FTP允许您传递Errno::EADDRINUSE开关,然后您将看到整个对话。

我知道Debug => 1还有更多内容可以让您收到错误报告。