大佬教程收集整理的这篇文章主要介绍了A Perl5 Script Copy File Via SSH,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
#!/usr/bin/env perl use utf8; use Strict; use warnings; use 5.10.0; use File::Copy qw/copy/; use File::stat; use Net::SFTP; use Getopt::Long; use File::Basename; use constant { OK => 1,}; # --remote # --inversion # --cplist=file my $Help = 0; my $remote = 0; my $mode = ""; my $cplist = ""; my $kpath = '.'; ##need path my $vpath = '.'; my %ssh = ( 'ip' => "192.168.8.73",'user' => "root",'pass' => "",); Getopt::Long::Configure ("bundling_override"); my $ret = GetOptions( 'remote|r' => \$remote,#use ssh or local? 'cplist|c:s' => \$cplist,#copy file list 'kpath|k:s' => \$kpath,#cplist key's path 'vpath|v:s' => \$vpath,#cplits value's path 'mode|m=s' => \$mode,#mode = k || v !! k = k | left | up v = v | right | down 'ip|h:s' => \$ssh{'ip'},'user|u:s' => \$ssh{'user'},'pass|p:s' => \$ssh{'pass'},'Help|?',=> \$Help,); if ($Help) { say 'copy.pl --cplist | -c "copy list file config"'; say '--mode | -m = [k | v | up | down | right | left] '; say '[--kpath | -k = ""] [--vpath | -v = ""]'; say '[--remote | -r] [--ip | -h = ""] [--user | -u = ""] [--pass | -p = ""]'; say '[--Help | ?]'; exit; } #printOptions(); errExit('Argument parser error') if (!$ret); if (!defined($mode = checkmode($modE))){ errExit("Mode shoud be k or v"); } my %list = (); if ($cplist eq "") { errExit("Need cplist."); } else { %list = readList($cplist); } if ($remotE) { if (! &isIp($ssh{'ip'})) { errExit('You lost host ip >_<'); } goto GOTO_LABEL_REMOTE; } else { goto GOTO_LABEL_LOCAL; } my $sftp; GOTO_LABEL_REMOTE: $sftp = Net::SFTP->new($ssh{'ip'},user => $ssh{'user'},password => $ssh{'pass'}); if (! $sftp) { die "Can not login $ssh{'user'}\@$ssh{'ip'}!"; } else { say "Connect to $ssh{'ip'}:22 with $ssh{'ip'} ok"; } sshCopyList($modE); exit; GOTO_LABEL_LOCAL: localCopyList($modE); exit; ############################################################# #ssh sub sshCopyList { my $d = shift @_; my @ks = keys(%list); if ($d) { ##1 -> upload foreach (@ks) { upload_ssh_ssh($sftp,$kpath . $_,$vpath . $list{$_}); } } else { foreach (@ks) { download_ssh_ssh($sftp,$vpath . $list{$_}); } } } sub upload_ssh_ssh { my ($s,$k,$v) = @_; say 'x' x 100; say "<1 upload $k -----> $v"; ###$k -> $v if (localExist(2,$k)) { sshUnlink($s,2,$v); sshUpload($s,3,$v); } say ''; } sub download_ssh_ssh { my ($s,$v,$d) = @_; say 'x' x 100; say "<1 download $k -----> $v"; if (sshExist($s,$k)) { localUnlink(2,$v); sshDownload($s,$v); } say ''; } ############################################################# #local sub localCopyList { my $d = shift @_; my @ks = keys(%list); if ($d) { ## 1 --> left -> right foreach (@ks) { copy_local_local($kpath . $_,$vpath . $list{$_}); } } else { foreach (@ks) { copy_local_local($vpath . $list{$_},$kpath . $_); } } } sub copy_local_local { my ($k,$v) = @_; say 'x' x 100; say "<1 copy $k -----> $v"; if (localExist(2,$v); localCopy(3,$v); } say ''; } ############################################################# # other sub part ## sub sshDownload { my ($sftp,$index,$src,$dest) = @_; say "<$index download $src -> $dest"; if (defined($sftp)) { my $ret = $sftp->get($src,$dest); return OK if $ret; } return !OK; } sub sshUpload { my ($sftp,$dest) = @_; say "<$index upload $src -> $dest"; if (defined($sftp)) { my $ret = $sftp->put($src,$dest); return OK if $ret; } return !OK; } sub sshUnlink { my ($sftp,$filE) = @_; die " ----- !!! don't unlink root dir / " if $file eq '/'; if (defined($sftp) && sshExist($sftp,$filE)) { my $ret = $sftp->do_remove($filE); if ($ret) { say "<$index !!: Can not delete $file"; return !OK; } say "<$index unlink $file"; } return OK; } sub sshExist { my ($sftp,$filE) = @_; if (defined($sftp)) { my @x = $sftp->ls(dirname($filE)); my $base = basename($filE); for my $f (@X) { if ($f->{filename} eq $basE) { return OK; } } } say "<$index remote file $file not exist."; return !OK; } sub localExist { my ($i,$f) = @_; if (! -e $f) { say "<$i local file $f not exist."; return !OK; } else { return OK; } } sub localUnlink { my $i = shift @_; say "<$i delete @_" if (unlink @_); } sub localCopy { my ($i,$v) = @_; say "<$i copy $k -> $v" if (copy $k,$v); } sub readList { my $file = shift @_; open my $fh,'<',$file or die "Can not open file $file"; my %ret; foreach (<$fh>) { chomp; next if (/\A#/); next if (/\A\Z/); next if (/\A\s*\Z/); my ($k,$v) = split(/\s+/); $ret{$k} = $v; } close($fh); %ret; } sub checkmode { my $mode = shift @_; if ($mode eq "k" || $mode eq "up" || $mode eq "left") { return OK; } if ($mode eq "v" || $mode eq "down" || $mode eq "right") { return !OK; } return undef; } sub printOptions { say 'remote = \'' . $remote . '\''; say 'cplist = \'' . $cplist . '\''; say 'mode = \'' . $mode . '\''; say 'ssh<ip> = \'' . $ssh{'ip'} . '\''; say 'ssh<user> = \'' . $ssh{'user'} . '\''; say 'ssh<pass> = \'' . $ssh{'pass'} . '\''; } sub isIp { $_ = shift @_; if (/\d{1,3}\.\d{1,3}/) { say $_; return OK; } else { return !OK; } } sub errExit { say 'Error in file ' . __FILE__ . ' line ' .__LINE__ . ',Errmsg => [' . (shift @_) . ']'; exit; }
以上是大佬教程为你收集整理的A Perl5 Script Copy File Via SSH全部内容,希望文章能够帮你解决A Perl5 Script Copy File Via SSH所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。