Shell指令:远程文件夹拷贝

时间:2022-03-30 21:41:11

1 文件夹通过ftp拷贝到远程机器上

ftp是不支持文件夹传输的(sftp可以),如果一定要通过ftp传输文件夹,可以有几种策略:

(1)如果条件允许可以使用ftp软件,FlashFTP,CuteFTP都是支持文件夹传输的。

(2)如果无法使用ftp工具可以使用考虑先打成压缩包,然后传过去解压缩以后再移动到指定目录,这是比较推荐的方式,但是会让脚本变得复杂一些,而且需要额外的压缩和解压缩时间。

(3)如果上面两个条件都不允许,必须使用shell脚本来完成这个任务,那么可以参考下面的方法。

  shell脚本:

#! /bin/sh
#bash ftpfloder.sh ip user pw /from /to
if [ $# != 5 ] ; then
echo "USAGE: $0 ip user pw /from /to"
echo " e.g.: $0 ip user pw /from /to"
exit 1;
fi
IP=$1 #服务器IP
user=$2 #ftp用户名
password=$3 #ftp密码
fromdir=$4 #源目录
todir=$5 #目的目录

dirs=`find $fromdir -type d -printf $todir/'%P\n'| awk '{if ($0 == "")next;print "mkdir " $0}'`
files=`find $fromdir -type f -printf 'put %p %P \n'`
ftp -nv $IP <<EOF
user $user $password
type binary
prompt
$ dirs
cd $todir
$ files
quit
EOF

调用这个脚本的方法:

FTPTOOLPATH="/roo /ftpfolder.sh"
FROMPATH="/root /from" #要上传的文件夹
TOPATH="/test/to" #目标文件夹
HOSTIP="10.80.59.1" #服务器
user=root #ftp用户名
password=271828#ftp密码

bash $FTPTOOLPATH $ HOSTIP $user $password $ FTPTOOLPATH $ TOPATH

整体思路:这是一个很笨的方法,使用ftp进行文件夹拷贝不行那么只好采取曲线救国的方式,先在目标目录生成文件夹的结构,然后再在这个基础上将需要传输的大量文件逐个的传过去。$dirs就是生成文件结构的操作,$ files是逐个传输文件到已经建立好的目录下的操作。

当然这样的操作存在一定的风险,那就是大量的文件传输的时候有可能会有文件损坏,在这一点上方法(3)是不及方法(2)的。

 

2 scp指令进行文件夹拷贝

 scp是基于ssh登录的,较于1中完全使用FTP的操作起来要方便很多。但存在一个问题是scp是基于基于安全认证的文件传输,无法在脚本里指定密码,需要在指令执行后手动输入密码,这对静默任务或者需要定时执行的任务来说是不适用的,但是对于单次任务来说是个不错的选择。

具体的使用是这样的

scp [可选参数] file_source file_target

传输文件:

scplocal_file remote_username@remote_ip:remote_folder 

示例:

scp /home/daisy/full.tar.gzroot@172.19.2.75:/home/root

传输文件夹:

scp-r local_folder remote_username@remote_ip:remote_folder

示例:

scp-r /home/space/music/ root@www.cumt.edu.cn:/home/root/others/