选择SCP复制

时间:2015-07-01 22:57:19

标签: linux bash perl ssh scp

我已经看过一个使用RSYNC和SSH来做这个的例子,但是在我的具体情况下我无法正常工作 - 它给了我一些关于协议版本的错误

我想将所有类型为.sh.jar.war的文件从目录结构复制到一个2跳的远程主机(ssh with代理人ssh away。

我不确定这样做的最佳方法。是SCP还是某种bash脚本?

我所知道的:

find . | grep "\.sh"

会给我一个很好的文件列表,我可以使用xargs对它们做些什么。

我想一些选项可能是创建一个tar.gz文件并scp,或者写一个小的bash脚本来做个人SCP?

我想出了用perl做这件事的可怕方法,但它真的很慢

my $find = `find .`;

my $remote = "USER\@MACHINE:";

my $remotePrefix = "/devel/test";


my @files = split('\n', $find);

foreach (@files) {

    if (/(.*\/)([^\/]*\.sh)$/ or
        /(.*\/)([^\/]*\.jar)$/ or
        /(.*\/)([^\/]*\.war)$/
        ) {

        my $fullPath = $_;
        my $directory = $1;
        my $file = $2;


    # print "$fullPath => $directory   ||     $file\n";

    $cmd1 = qq(ssh USER\@MACHINE mkdir -p $remotePrefix$directory);
    $cmd2 = qq(scp $_ $remote$remotePrefix$_);


    `$cmd1`;
    `$cmd2`;
    }
}

3 个答案:

答案 0 :(得分:1)

假设您的文件名不包含换行符,您可以使用cpio(1)执行此操作:

find . -type f \( -name '*.sh' -o -name '*.[jw]ar' \) -print | \
    cpio -oa | \
    ssh "${USER}@${MACHINE}" "cd ${remotePrefix}; cpio -idm"

答案 1 :(得分:1)

有点旧的帖子,但我只是有一个类似的任务,经过一些研究在bash中提出这个,使用sshpass允许内联ssh使用,基本目录存在于本地和远程服务器上。将在远程服务器上创建新文件目录。这称为:script fid src-base-dir

#!/bin/bash

fid=$1;  
basedir=$2;

##myfiles are fixed 10 numeric files stored in respective directories starting at the 6th pos
##eg dir 1234560000 for files 1234560000.file - 1234569999.file

dir=${fid:0:6}0000;     ## modify for your directory type or use other shell substring  
fpath=$dir/$fid.file;   ## here you could expand bash to specify extensions or all eg $dir/$fid.{csv,jpg,js}

if [ -a "$basedir/$fpath" ]
then
    rDir=$(sshpass -e ssh -p <myport> <user>@<server> "ls '$basdir/$dir' 2>&1 > /dev/null ");
    if [[ ! -z $rDir ]];        
    then
        sshpass -e ssh -p <myport> <user>@<server> "mkdir '$basedir/$dir'";
        sshpass -e scp -P <myport> $basedir/$fpath <user>@<server>:"$basedir/$fpath";
    else
        sshpass -e scp -P <myport> $basedir/$fpath <user>@<server>:"$basedir/$fpath";
    fi
else
    echo $basedir/$fpath no exist!!
fi

答案 2 :(得分:0)

使用Net::SFTP::Foreign

use Net::SFTP::Foreign;
my $sftp = Net::SFTP::Foreign->new($host, user => $user);
$sftp->rput('.', $remote_prefix,
            wanted => qr/\.(?:sh|war|jar)$/);