• scp和Rsync远程拷贝的技巧


    cpsecure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsyncscp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。scp在夸机器复制的时候为了提高数据的安全性,使用了ssh连接和加密方式,如果机器之间配置了ssh免密码登录,那在使用scp的时候密码都不用输入。

    一般而言,我们会选择使用rsync进行远程同步或拷贝。rsyncscp的区别在于:
    -> rsync只对差异文件做更新,可以做增量或全量备份;而scp只能做全量备份。简单说就是rsync只传修改了的部分,如果改动较小就不需要全部重传,所以rsync备份速度较快;默认情况下,rsync 通过比较文件的最后修改时间(mtime)和文件的大小(size)来确认哪些文件需要被同步过去。
    -> rsync是分块校验+传输,scp是整个文件传输。rsyncscp有优势的地方在于单个大文件的一小部分存在改动时,只需传输改动部分,无需重新传输整个文件。如果传输一个新的文件,理论上rsync没有优势;
    -> rsync不是加密传输,而scp是加密传输,使用时可以按需选择。

    SCP拷贝命令中常用的几个参数说明

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    -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拷贝命令中常用的几个参数说明

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    -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

    在使用SCPRsync进行远程同步的时候,需要注意下面几个技巧:

    1)远程拷贝时的软链接处理

    1

    2

    3

    4

    5

    6

    用rsync远程拷贝目录时,只需要加上-l参数就可以实现拷贝软链接。

    用scp远程拷贝目录时, 那么目录下的软链会丢失,如果想要软链接也拷贝过去,正确的做法是:

    1)在源服务器上, 打包, tar zcvf test.tar.gz test

    2)把源服务器上的test.tar.gz拷贝到目标服务器上

    3)在目标服务器上执行tar zxvf test.tar.gz, 进行解包, 可以看到, 软链接保持得好好的。

    2)远程拷贝时的进度条显示

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    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)远程拷贝时的限流

    1

    2

    3

    4

    5

    6

    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)远程拷贝时的过滤

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    -----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

    2)也可以通过--exclude-from来指定,例如

    [root@dbtest bak]# /usr/bin/rsync -vzrtopg --exclude-from=exclude.list /var/www/src/ /var/www/de

    exclude.list文件中指定需要排除的列表,例如:

    dir1

    [0-9]*

    dir2/.[a-z0-9]*

    .svn

    注意:

    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)远程拷贝时的隐藏文件

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    -----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 ..

  • 相关阅读:
    lua协程一则报错解决“attempt to yield across metamethod/C-call boundary”
    web server && web framework角色区分
    throttle在程序中的作用
    如何将SVN patch的修改做成old&new文件
    lua 环境揭秘
    lua module package.seeall选项
    lua module环境探秘
    lua OOP实现对象的链式调用
    项目管理(一)任务分配
    项目管理(三)展望
  • 原文地址:https://www.cnblogs.com/henrylinux/p/9750862.html
Copyright © 2020-2023  润新知