scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它相似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,并且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system时,用scp能够帮你把文件移出来。另外,scp还很是不占资源,不会提升多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的状况下,rsync会致使硬盘I/O很是高,而scp基本不影响系统正常使用。scp在夸机器复制的时候为了提升数据的安全性,使用了ssh链接和加密方式,若是机器之间配置了ssh免密码登陆,那在使用scp的时候密码都不用输入。安全
通常而言,咱们会选择使用rsync进行远程同步或拷贝。rsync和scp的区别在于:
-> rsync只对差别文件作更新,能够作增量或全量备份;而scp只能作全量备份。简单说就是rsync只传修改了的部分,若是改动较小就不须要所有重传,因此rsync备份速度较快;默认状况下,rsync 经过比较文件的最后修改时间(mtime)和文件的大小(size)来确认哪些文件须要被同步过去。
-> rsync是分块校验+传输,scp是整个文件传输。rsync比scp有优点的地方在于单个大文件的一小部分存在改动时,只需传输改动部分,无需从新传输整个文件。若是传输一个新的文件,理论上rsync没有优点;
-> rsync不是加密传输,而scp是加密传输,使用时能够按需选择。bash
SCP拷贝命令中经常使用的几个参数说明服务器
-B 使用批处理模式(传输过程当中不询问传输口令或短语) -C 容许压缩。(将-C标志传递给ssh,从而打开压缩功能) -p 保留原文件的修改时间,访问时间和访问权限。 -q 不显示传输进度条。 -r 递归复制整个目录。 -v 详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试链接,验证和配置问题。 -c cipher 以cipher将数据传输进行加密,这个选项将直接传递给ssh。 -F ssh_config 指定一个替代的ssh配置文件,此参数直接传递给ssh。 -i identity_file 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。 -l limit 限定用户所能使用的带宽,以Kbit/s为单位。 -o ssh_option 若是习惯于使用ssh_config(5)中的参数传递方式, -P port 注意是大写的P, port是指定数据传输用到的端口号 -S program 指定加密传输时所使用的程序。此程序必须可以理解ssh(1)的选项。
Rsync拷贝命令中经常使用的几个参数说明ssh
-a, --archive 归档模式,表示以递归方式传输文件,并保持全部文件属性,等于-rlptgoD -v, --verbose 详细模式输出 -p, --perms 保持文件权限 -g, --group 保持文件属组信息 -o, --owner 保持文件属主信息 -r, --recursive 对子目录以递归模式处理。同步目录的时候要加上这个参数 -l, --links 保留软链结,加上这个参数,同步过来的文件会保持以前的软连接属性不变 -H, --hard-links 保留硬链结 -e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步 -z, --compress 对备份的文件在传输时进行压缩处理 --stats 给出某些文件的传输状态 --progress 打印同步的过程 --timeout=TIME 同步过程当中,IP超时时间,单位为秒 --delete 删除那些目标目录中有而源目录中没有的多余文件。这个是rsync作增量方式的全备份的最佳选择方案!!!!!! --delete-before 接受者在输出以前进行删除操做。即先将目标目录中文件所有删除,再将源目录文件拷贝过去。这是rsync保持目标目录跟源目录一致的方案!!! --delete-after 在同步操做以后作比较,删除那些目标目录中有而源目录中没有的多余文件 --delete-excluded 删除目标目录中那些被该选项指定排除的文件 --ignore-errors 即便出现IO错误也进行删除,忽略错误 --exclude 指定同步时须要过滤掉的文件或子目录(即不须要同步过去的),后面直接跟不须要同步的单个文件名或子目录(不须要跟路径) ,过滤多个文件或子目录,就使用多个--exclude --exclude-from 指定同步时须要过滤掉的文件或子目录,后面跟文件(好比/root/exclue.txt),而后将不须要同步的文件和子目录放到/root/exclue.txt下。 --version 打印版本信息 --port=PORT 指定其余的rsync服务端口 --log-format=formAT 指定日志文件格式 --password-file=FILE 从FILE中获得密码 --bwlimit=KBPS 限制I/O带宽,KBytes per second
在使用SCP和Rsync进行远程同步的时候,须要注意下面几个技巧:ide
1)远程拷贝时的软连接处理svn
用rsync远程拷贝目录时,只须要加上-l参数就能够实现拷贝软连接。 用scp远程拷贝目录时, 那么目录下的软链会丢失,若是想要软连接也拷贝过去,正确的作法是: 1)在源服务器上, 打包, tar zcvf test.tar.gz test 2)把源服务器上的test.tar.gz拷贝到目标服务器上 3)在目标服务器上执行tar zxvf test.tar.gz, 进行解包, 能够看到, 软连接保持得好好的。
2)远程拷贝时的进度条显示加密
1)rsync命令 [root@dbtest bak]# rsync -e "ssh -p22222" -avpgolr --progress db170630.tar.gz 192.168.1.198:/data/upload/ root@192.168.1.198's password: sending incremental file list db170630.tar.gz 702087168 4% 5.60MB/s 0:41:47 --progress 能够实现本机带进度条提示拷贝,能够实现不一样机器带进度条提示拷贝,能够拷贝多个文件 2)scp命令 [root@dbtest bak]# scp -v /mnt/full20100526.tar.gz /usr/local/src/ [以上命令] 本机拷贝没法显示进度 [root@dbtest bak]# scp -v /mnt/full20100526.tar.gz root@192.168.1.1:/usr/local/src/ [以上命令] 不一样机器拷贝能够显示进度条,即便不带"-v"参数也能够显示进度条 [root@dbtest bak]# scp -v /mnt/full20100526.tar.gz root@127.0.0.1:/usr/local/src/ [以上命令] 变相实现本机带进度条提示拷贝,能够不带"-v"参数 3) cp命令 暂时没有找到带进度条提示拷贝
3)远程拷贝时的限流spa
rsync拷贝命令(--bwlimit) [root@dbtest bak]# rsync -auvz --progress --delete --bwlimit=1000 远程文件 本地文件 //限制为1000kBytes/s [root@dbtest bak]# rsync -auvz --progress --delete --bwlimit=2048 远程文件 本地文件 //限制为2M/s scp拷贝命令(-l参数) [root@dbtest bak]# scp -l 1024 file root@192.168.1.100 //限制为1M Bytes/s
4)远程拷贝时的过滤命令行
-----rsync命令----- 须要排除某个文件(或文件夹),能够用--exclude来指定(事实上,系统会把文件和文件夹一视同仁)。例如: 1)须要排除源目录下的dir1文件夹,能够写为: [root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude=dir1 /var/www/src/ /var/www/dest 能够同时排除多条 [root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude=dir1 --exclude=dir2 /var/www/src/ /var/www/dest [root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude "file1" --exclude="file2" --exclude dir1 --exclude=dir2 /var/www/src/ /var/www/dest 注意: a)过滤参数使用"--exclude"或"--exclude="均可以,参数后面跟的文件或目录加不加引号的效果也都同样! b)过滤参数后面跟的文件或目录必须直接是文件或目录名,不能跟路径(不论是相对路径仍是绝对路径,不然就过滤不掉) 好比:下面的写法就过滤不掉test目录下的file1文件,不论是相对路径仍是绝对路径 [root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude "/var/www/src/test/file1" /var/www/src/ /var/www/dest [root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude "../test1" /var/www/src/ /var/www/dest 去掉路径,使用下面的写法就能够正常过滤了 [root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude "file1" /var/www/src/ /var/www/dest c)另外:过滤参数还可使用通配符 避开不想同步的文件或目录, 例如,同步/var/www/src/目录下的内容到/var/www/dest目录下,同步时过滤以test开头的文件/目录 以及 以data结尾的文件/目录 [root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude "test*" --exclude="*data" /var/www/src/ /var/www/dest 2)若是想要过滤同步的文件或目录过多,能够经过--exclude-from来指定一个特定文件。例如: [root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude-from=exclude.list /var/www/src/ /var/www/dest exclude.list文件中指定须要排除的文件或目录列表(这个文件前面的参数只能是--exclude-from) [root@dbtest bak]# cat exclude.list dir1 [0-9]* dir2/.[a-z0-9]* .svn 或者 [root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude-from="/data/bak/exclude.list" /var/www/src/ /var/www/dest 注意: a)过滤参数使用"--exclude-from"或者"--exclude-from="均可以,后面的文件名加不加引号效果也都同样。 b)这里过滤参数后面跟的exclude.list文件,为了不出问题,最好设置为绝对路径。可是里面的内容必定要写为相对路径(即当前同步源目录下的相对路径或直接是文件名/目录名) c)exclude和exclude-from前面都是有两个减号,若是漏写了一个,命令行不会报错,可是不能排除执行的文件或文件夹。 -----scp命令----- 结合find命令进行操做,例如: 将/data目录下除了ms目录以外的全部目录及文件远程拷贝到10.0.11.202机器的/data目录下 [root@dbtest bak]# for i in `find /data/ -type d -path /data/ms -prune -o -print |awk -F"/" '{print $3}'|sort|uniq`;do /usr/bin/scp -r /data/$i root@10.0.11.202:/data/;done
5)远程拷贝时的隐藏文件调试
-----rsync命令----- 以下(注意带/) 能够将/path/to/source/目录下全部的文件(包括隐藏文件)一块儿拷贝到192.168.1.5机器的/path/to/dest/目录下 [root@dbtest bak]# rsync -e "ssh -p22" -avpgolr /path/to/source/ user@192.168.1.5:/path/to/dest/ 以下(注意带/*) 能够将/path/to/source/目录下全部的文件(不包括隐藏文件)一块儿拷贝到192.168.1.5机器的/path/to/dest/目录下 [root@dbtest bak]# rsync -e "ssh -p22" -avpgolr /path/to/source/* user@192.168.1.5:/path/to/dest/ -----scp命令----- 以下(注意带) 能够将/path/to/source/目录下全部的文件(包括隐藏文件)一块儿拷贝到192.168.1.5机器的/path/to/dest/目录下 [root@dbtest bak]# scp -rp -P 22 /path/to/source/. user@192.168.1.5:/path/to/dest/ 若是直接使用/,则就是把/path/to/source整个目录拷贝到192.168.1.5机器的/path/to/dest/目录下,即拷贝到远程 的目录是/path/to/dest/source [root@dbtest bak]# scp -rp -P 22 /path/to/source/ user@192.168.1.5:/path/to/dest/ 以下(注意/*) 能够将/path/to/source/目录下全部的文件(不包括隐藏文件)一块儿拷贝到192.168.1.5机器的/path/to/dest/目录下 [root@dbtest bak]# scp -rp -P 22 /path/to/source/* user@192.168.1.5:/path/to/dest/ --------------- 注意,直接使用rm或rm -rf删除一个目录时,默认目录下的隐藏文件是删除不掉的,隐藏文件须要单独删除,以下: [root@dbtest ~]# cd /opt/ [root@dbtest opt]# ll -a total 28 drwxr-xr-x. 3 root root 4096 Mar 8 15:00 . dr-xr-xr-x. 27 root root 4096 Feb 26 03:54 .. -rw-r--r--. 1 root root 0 Mar 8 09:47 ac -rw-r--r--. 1 root root 45 Mar 8 09:47 a.txt -rw-r--r--. 1 root root 0 Mar 8 09:47 bb -rw-r--r--. 1 root root 21 Mar 8 09:45 b.txt -rw-r--r--. 1 root root 0 Mar 8 09:47 gg -rw-r--r--. 1 root root 52 Mar 8 15:00 .haha drwxr-xr-x. 2 root root 4096 Mar 8 15:00 .kevin -rw-r--r--. 1 root root 33 Mar 8 15:00 .my.cnf [root@dbtest opt]# rm -rf ./* [root@dbtest opt]# ll -a total 20 drwxr-xr-x. 3 root root 4096 Mar 8 17:44 . dr-xr-xr-x. 27 root root 4096 Feb 26 03:54 .. -rw-r--r--. 1 root root 52 Mar 8 15:00 .haha drwxr-xr-x. 2 root root 4096 Mar 8 15:00 .kevin -rw-r--r--. 1 root root 33 Mar 8 15:00 .my.cnf [root@dbtest opt]# rm -rf .haha .kevin .my.cnf [root@dbtest opt]# ll -a total 8 drwxr-xr-x. 2 root root 4096 Mar 8 17:44 . dr-xr-xr-x. 27 root root 4096 Feb 26 03:54 ..