Select SCP复制
Select SCP Copy
我看过一个使用 RSYNC 和 SSH 来执行此操作的示例,但是在我的特定情况下我无法正常工作 - 它给了我一些关于协议版本的错误
我想将目录结构中 .sh
、.jar
、.war
类型的所有文件复制到 2 跳的远程主机(ssh 与代理)ssh 离开。
我不确定执行此操作的最佳方法。是用 SCP 还是某种 bash 脚本?
我知道的:
find . | grep "\.sh"
会给我一个很好的文件列表,我可以使用 xargs
对它们做一些事情。
我想一些选择是创建一个 tar.gz
文件并 scp
它,或者写一些 bash 脚本来做单独的 SCP-ing?
我用 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 = ;
my $file = ;
# print "$fullPath => $directory || $file\n";
$cmd1 = qq(ssh USER\@MACHINE mkdir -p $remotePrefix$directory);
$cmd2 = qq(scp $_ $remote$remotePrefix$_);
`$cmd1`;
`$cmd2`;
}
}
假设您的文件名不包含换行符,您可以使用 cpio(1)
:
find . -type f \( -name '*.sh' -o -name '*.[jw]ar' \) -print | \
cpio -oa | \
ssh "${USER}@${MACHINE}" "cd ${remotePrefix}; cpio -idm"
use Net::SFTP::Foreign;
my $sftp = Net::SFTP::Foreign->new($host, user => $user);
$sftp->rput('.', $remote_prefix,
wanted => qr/\.(?:sh|war|jar)$/);
有点老 post 但我只是有一个类似的任务,经过一些研究后 bash,使用 sshpass 允许内联 ssh 使用,基本目录存在于本地和远程服务器。新文件目录将在远程服务器上创建。这被称为:script fid src-base-dir
#!/bin/bash
fid=;
basedir=;
##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
我看过一个使用 RSYNC 和 SSH 来执行此操作的示例,但是在我的特定情况下我无法正常工作 - 它给了我一些关于协议版本的错误
我想将目录结构中 .sh
、.jar
、.war
类型的所有文件复制到 2 跳的远程主机(ssh 与代理)ssh 离开。
我不确定执行此操作的最佳方法。是用 SCP 还是某种 bash 脚本?
我知道的:
find . | grep "\.sh"
会给我一个很好的文件列表,我可以使用 xargs
对它们做一些事情。
我想一些选择是创建一个 tar.gz
文件并 scp
它,或者写一些 bash 脚本来做单独的 SCP-ing?
我用 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 = ;
my $file = ;
# print "$fullPath => $directory || $file\n";
$cmd1 = qq(ssh USER\@MACHINE mkdir -p $remotePrefix$directory);
$cmd2 = qq(scp $_ $remote$remotePrefix$_);
`$cmd1`;
`$cmd2`;
}
}
假设您的文件名不包含换行符,您可以使用 cpio(1)
:
find . -type f \( -name '*.sh' -o -name '*.[jw]ar' \) -print | \
cpio -oa | \
ssh "${USER}@${MACHINE}" "cd ${remotePrefix}; cpio -idm"
use Net::SFTP::Foreign;
my $sftp = Net::SFTP::Foreign->new($host, user => $user);
$sftp->rput('.', $remote_prefix,
wanted => qr/\.(?:sh|war|jar)$/);
有点老 post 但我只是有一个类似的任务,经过一些研究后 bash,使用 sshpass 允许内联 ssh 使用,基本目录存在于本地和远程服务器。新文件目录将在远程服务器上创建。这被称为:script fid src-base-dir
#!/bin/bash
fid=;
basedir=;
##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