公司要求远程备份部分服务器上的数据,服务器端用vsftp,客户端用perl的Net::Ftp模块很容易实现,文件续传用seek函数。
脚本中设置ftp传输模式为二进制模式,使用Net::Ftp模块的size获取服务器端文件的大小。再用seek定位续传点。最后使用appe进行续传。通过shell也很容易实现,因为lftp命令很强大。续传完成不放心可以在脚本中进行MD5码较验。
linux的世界,没有走进来一切都很神秘,走进来一切又都那么有趣,虽然这么多年了,仍然让我流恋往返。
#本地要上传的文件名
my $file = "${my_id}_$today.sql.tgz";
return unless -f $file;
#上传到服务器后的文件名
my $new_file = file_md5_hex($file)."#"."$file";
#打开本地文件
open FH,$file or return;
#登录到服务器端
my $object = Net::FTP->new($ftp{host},Port=>$ftp{port},Timeout=>$ftp{timeout})
or die "Can't connect:$!";
$object->login( $ftp{user}, $ftp{passwd} ) or die "Can't login:$!";
$object->binary;
$object->hash(1);
#得到服务器端文件大小
my $size=$object->size( basename($new_file) ) || 0;
#在本地文件中移动指针到服务器端文件size的位置
seek( FH, $size, 0 );
#使用追加模式
my $fh = $object->appe($new_file) or die $object->message;
my $data;
#续传
syswrite( $fh, $data, BUF_SIZE ) while sysread( FH, $data, BUF_SIZE );
close $fh;
$object->quit;
close FH;
阅读(1362) | 评论(0) | 转发(0) |