Perl   发布时间:2019-10-06  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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,请注明来意。
标签: