SCP和Rsync远程拷贝的几个技巧

本文对比SCP与Rsync两种远程文件拷贝工具的特点与应用场景,分析它们在加密传输、文件同步、软链接处理、进度显示、限流、过滤等方面的区别。

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是加密传输,使用时可以按需选择。

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

1

2

3

4

5

6

7

8

9

10

11

12

13

-B  使用批处理模式(传输过程中不询问传输口令或短语) 

-C  允许压缩。(将-C标志传递给ssh,从而打开压缩功能) 

-p  保留原文件的修改时间,访问时间和访问权限。 

-q  不显示传输进度条。 

-r  递归复制整个目录。 

-v 详细方式显示输出。scpssh(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

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

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

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

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

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/

 

---------------

注意,直接使用rmrm -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 ..

<think>好的,我现在需要帮助用户了解如何使用scp命令进行文件拷贝。用户已经提供了几个相关的引用内容,我需要综合这些信息,并结合用户之前的问题来给出一个清晰、详细的回答。 首先,用户之前的问题是关于在ROS 2中查看MCAP包的详细信息,现在转向了scp命令的使用。可能用户在进行ROS开发时需要将文件传输到远程服务器或从服务器下载数据,因此需要掌握scp的基本操作。 接下来,我需要参考用户提供的四个引用内容,这些引用详细说明了scp的用法、参数以及示例。需要注意的是,用户可能已经对Linux有一定了解,但作为新手,可能需要更基础的指导,包括命令格式、常见参数实际例子。 用户的问题是如何使用scp进行文件拷贝,因此回答需要覆盖从本地到远程远程到本地的传输,以及目录文件的处理。同时,引用中提到了一些参数,比如-P指定端口,-r递归复制,-p保留属性,-C压缩传输,-q静默模式等,这些都需要在回答中解释清楚。 用户可能的需求包括:基本命令格式、不同场景下的应用(如指定端口、复制目录、保持文件属性)、常见问题处理(如权限问题、SSH配置)。此外,用户可能关心如何验证传输后的文件完整性,这也是一个实用的点,可以在回答中提到。 需要确保回答结构清晰,分步骤讲解,每个部分都有示例,这样用户能够按照步骤操作。同时,要避免使用过于专业的术语,保持语言简洁易懂。最后,相关问题部分可以引导用户进一步学习,比如处理传输中断、提高传输速度等,这些可能也是用户后续会遇到的问题。 总结步骤: 1. 介绍scp的基本概念用途。 2. 详细说明本地到远程远程到本地的文件传输命令,包括不同参数的使用。 3. 提供目录传输的方法。 4. 解释常用参数的作用。 5. 给出验证文件完整性的方法。 6. 常见问题处理,如端口问题、权限问题。 7. 生成相关问题,帮助用户深入学习解决问题。</think>--- ### 一、SCP 基础概念 SCP(Secure Copy Protocol)是基于 SSH 协议的安全文件传输工具,适用于 Linux/Unix 系统之间的远程文件拷贝。其特点包括: - **加密传输**:所有数据通过 SSH 加密,防止中间人攻击[^1][^2] - **跨服务器操作**:支持本地与远程远程远程之间的文件传输 - **灵活参数**:支持递归复制、端口指定、带宽限制等功能[^3] --- ### 二、核心操作场景 #### 1. 本地 → 远程传输 **基本格式**: ```bash scp [参数] 本地文件路径 用户名@远程IP:目标路径 ``` **示例**: ```bash # 传输单个文件到远程主机的/home/user目录(默认SSH端口22) scp report.pdf user@192.168.1.100:/home/user # 指定端口号(若远程SSH端口为2222) scp -P 2222 backup.tar.gz user@example.com:/opt/backups # 传输目录(递归复制) scp -r ~/project_folder user@10.0.0.5:/var/www # 传输时保留文件属性(修改时间、权限) scp -p config.ini user@server:/etc/app ``` #### 2. 远程 → 本地传输 **基本格式**: ```bash scp [参数] 用户名@远程IP:文件路径 本地目标路径 ``` **示例**: ```bash # 下载远程日志文件到当前目录 scp user@192.168.1.100:/var/log/app.log . # 下载整个数据库备份目录(指定非标端口) scp -P 2222 -r admin@db.example.com:/backups/mysql ~/local_backups # 重命名下载文件 scp user@server:/data/report.csv ./monthly_report_final.csv ``` #### 3. 远程远程传输 ```bash scp user1@source_host:/path/to/file user2@dest_host:/target/path ``` --- ### 三、常用参数详解 | 参数 | 作用 | 示例场景 | |------|------|----------| | `-P` | 指定 SSH 端口 | 连接使用非标准端口的服务器 | | `-r` | 递归复制目录 | 传输项目文件夹时必需 | | `-C` | 启用压缩 | 传输大文件时节省带宽 | | `-p` | 保留文件属性 | 保持文件时间戳权限 | | `-q` | 静默模式 | 脚本中避免输出干扰 | | `-l` | 带宽限制(单位 Kbit/s) | `-l 800` 限制为 100KB/s | | `-i` | 指定密钥文件 | 使用非默认SSH密钥认证 | --- ### 四、高阶使用技巧 #### 1. 断点续传(通过rsync实现) ```bash rsync -P --rsh='ssh -p 2222' large_file.iso user@remote:/backups ``` `-P` 参数显示进度并支持断点续传[^4] #### 2. 文件完整性验证 传输完成后校验 MD5: ```bash # 本地生成校验值 md5sum bigfile.zip # 远程生成校验值 ssh user@remote "md5sum /path/to/bigfile.zip" ``` #### 3. 批量传输脚本 ```bash #!/bin/bash FILES=("file1" "file2" "dir/") REMOTE="user@192.168.1.100:/backup" for item in "${FILES[@]}"; do scp -r -C -p "$item" "$REMOTE" done ``` --- ### 五、常见问题处理 #### 1. **"Permission denied" 错误** - 确认远程用户是否有目标目录写入权限 - 检查 SSH 密钥配置是否正确 - 尝试添加 `-v` 参数查看详细错误信息 #### 2. **大文件传输中断** - 使用 `screen` 或 `tmux` 保持会话 - 改用 `rsync` 支持断点续传 #### 3. **特殊字符处理** 文件名含空格时使用引号包裹: ```bash scp "Photo 2023.jpg" user@remote:"~/Photos/New\ Folder/" ``` --- ### 六、性能优化建议 1. **启用压缩**(适合文本类文件) ```bash scp -C source.txt user@remote:/dest ``` 2. **并行传输多个文件** ```bash scp file1.txt file2.txt user@remote:/dest/ ``` 3. **禁用加密加速传输**(仅限内网安全环境) ```bash scp -c none large_file.iso user@remote:/dest ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值