细说文件传输协议缺点
文件传输协议(FTP)在RFC 959中定义,于1985年10月发布。文件传输协议(FTP)被设计成为一个跨平台的、简单且易于实现的协议。文件传输协议(FTP)有一个漫长的演化史,是互联网上最重要的应用之一,但时至今日,却已江河日下。从各方面列举了一些文件传输协议(FTP)为人诟病的缺点。各主流浏览器在2021年后逐步放弃了对 FTP 协议的支持。
1.数据传输模式不合理
不考虑文件自身的内容,一味使用ASCII模式传输数据是不合理的。文件传输协议(FTP)应该具有自动检测功能,当然用户也可以进行自定义。
虽然现在许多Linux和Windows客户端已经支持自动传输模式,但多达数代的UNIX和Windows客户端都默认使用ASCII传输模式,这种传输模式甚至会造成文件损坏。
2.工作方式设计不合理
文件传输协议(FTP)可以在主动模式(PORT)或被动模式(PASV)下工作,这决定了数据链接建立的方式。
在主动模式下,客户端首先向服务器端发送IP地址和端口号,然后等待服务器端建立TCP链接。在被动模式下,客户端同样首先建立到服务器的链接,但服务器端会开启一个端口(1024到5000之间),等待客户端传输数据。
文件传输协议(FTP)中最让人不可思议的是,客户端会侦听服务器端!
3.与防火墙工作不协调
在文件传输协议(FTP)诞生在网络地址转换(NAT)和防火墙之前,那时的网络还不存在恶意攻击。今天大多数最终用户的IPv4地址已不可路由,这是因为防火墙的使用和IPv4地址的短缺。
这对FTP意味着什么呢?这意味着如果FTP客户端IP地址不可路由,或者位于防火墙之后,那么就只能使用被动传输模式进行数据传输。
如果服务器端的IP地址也不可路由,或者位于防火墙之后呢?FTP将无法进行数据传输!现在,许多防火墙适用于NAT环境,可以使用一些特殊的技巧(hacks)允许FTP在防火墙之后正常工作。当然这需要对防火墙进行配置。
4.密码安全策略不完善
在互联网早期,文件传输协议(FTP)并没有对密码安全作出规定。在FTP客户端和服务器端,数据以明文的形式传输,任何对通讯路径上的路由具有控制能力的人,都可以通过嗅探获取你的密码和数据。
我们当然可以使用SSL封装FTP,但FTP是通过建立多次链接进行数据传输的,我们即便是保护了密码安全,也很难保护数据传输的安全性。自文件传输协议(FTP)发布以来,安全的数据传输也经历了长足发展,推荐使用SCP取代FTP进行文件传输。
5.FTP协议效率低下
从FTP服务器上检索一个文件,包含繁复的交换握手步骤:
客户端建立到FTP服务器端控制端口的TCP Socket链接,并等待TCP握手完成
客户端等待服务器端发送回执
客户端向服务器端发送用户名并等待响应
客户端向服务器端发送密码并等待响应
客户端向服务器端发送SYST命令并等待响应
客户端向服务器端发送TYPE I命令并等待响应
如果用户需要在服务器端切换目录,客户端仍然发送命令并等待响应
主动模式下,客户端需要发送PORT命令到服务器端,然后等待响应(被动模式与主动模式相反)
建立数据传输链接(需要经过三次握手,建立一条TCP Socket连接)
通过链接传输数据
客户端等待服务器端从控制连接发送2xx指令,以确保数据传输成功
客户端发送QUIT命令,并等待服务器响应
同样的情形,我们来看看HTTP协议:
HTTP客户端向HTTP服务器端建立一条TCP Socket连接
HTTP客户端向HTTP服务器端发送GET命令,包含URL、HTTP协议版本、虚拟主机名等等,并等待响应
HTTP服务器端的响应包含了所有想要的数据,完成!
传输一个文件,FTP需要往复10次,而HTTP只需要2次!如果传输多个文件,FTP可以省略发送用户名和密码的步骤,而HTTP则可以使用固定的套接字(Socket),在相同的TCP连接中传输文件。
综上所述,虽然文件传输协议(FTP)曾经显赫一时,但现在已经过时了,它是一个既不不安全,也不不友好,而且效率低下的协议,势必被取而代之。
FTP和HTTP协议的比较
1、HTTP协议是用来浏览网站的,而FTP是用来访问和传输文件的,FTP文件传输有点批量上传和维护网站的意思,而HTTP文件传输更多的是为终端用户提供文件传输,比如电影、图片、音乐之类。
2、HTTP 和 FTP 客户端:通常的HTTP客户端就是浏览器,而FTP服务可以通过命令行或者用户自有的图形界面客户端。
3、HTTP 头:HTTP 头包含了 metadata ,比如说最后更改的日期、编码方式、服务器名称版本还有其他的一些信息,而这些在FTP中是不存在的。
4、FTP要比HTTP早出现10年左右。
5、数据格式:FTP能传输ACSII数据或者二进制格式的数据,而HTTP只用二进制格式。
6、HTTP中的流水线:HTTP支持流水线,这就意味着客户端可以在上一个请求处理完之前,发出下一个请求,其结果就是多次请求数据之前省掉了部分服务器客户端往返时延。而FTP并没有这项支持。
7、HTTP中的动态端口:FTP一个最大的问题就是它使用两个连接,第一个连接用来发送控制指令,当接受或者发送数据的时候,又打开第二个TCP连接。而HTTP在双向传输中使用动态端口。
8、HTTP中的持久连接:对一个HTTP会话来讲,客户端可以维护一个单个的连接并使用它进行任意数量的数据传输。FTP每次有数据的需要时都创建一个新的连接。重复的创建新的连接带来的体验并不好,因为每次创建连接都必须让双方握手验证,这消耗了很多时间。
9、HTTP中的压缩算法:HTTP提供了一个在一些压缩算法中客户端和服务器共同协商选择的办法。其中gzip可以说是最有影响力的一种,而FTP中并不存在这种复杂的算法。
10、HTTP支持代理:HTTP一个很大的特点就是支持代理,这种功能是构建在协议里的,而FTP并不支持。
11、而FTP也能脱颖而出的一点是这个协议是直接面向文件级别的。这以为着FTP有例如可以通过命令列出远程服务器上的目录列表,而HTTP没有这个概念。
12、速度:可能最通常的问题了:哪一个传输更快?
什么使FTP服务更快?
1、没有在发出的数据中加入meta-data,仅传输原二进制文件。
2、没有过度的分块编码
什么使HTTP服务更快?
1、重用已存在的持久连接,从而有更好的TCP表现。
2、流水线的支持使得从同一个服务器上请求多个文件更快。
3、自动的压缩机制使得传输的数据更少。
4、没有命令/应答机制最大限度的减少了往返时延。
总结:当然最终的结果会因具体的情况而异,但我想说的是,单次传输一个静态的文件,很难衡量两者的区别对单个的小文件来说,FTP传输更快,当传输多个文件时,HTTP更快。
盘点Linux主机之间传输文件的方法
1.scp传输
scp -r /data/file root@ip:/data/
scp -C /data/sda.img root@ip:/data/img/
#-r: 支持目录
#-C: 启用压缩传送
scp传输速度较慢,但使用ssh通道保证了传输的安全性。下面列出SCP的常见用法:
一、基本文件复制
1. 本地到远程复制
将本地文件复制到远程主机(基本用法)。
scp /local/file user@remote-host:/remote/path/
2. 远程到本地复制
将远程文件复制到本地目录。
scp user@remote-host:/remote/file /local/path/
3. 指定端口复制
使用自定义端口(如2222)复制文件(-P)。
scp -P 2222 /local/file user@remote-host:/remote/path/
4. 使用密钥认证
使用私钥文件认证复制(-i)。
scp -i ~/.ssh/id_rsa /local/file user@remote-host:/remote/path/
5. 安静模式复制
抑制进度和错误输出(-q)。
scp -q /local/file user@remote-host:/remote/path/
6. 详细模式复制
显示详细调试信息(-v)。
scp -v /local/file user@remote-host:/remote/path/
7. 启用压缩
启用压缩传输加速(-C)。
scp -C /local/file user@remote-host:/remote/path/
8. 保持文件属性
保持文件时间戳、模式和所有者(-p)。
scp -p /local/file user@remote-host:/remote/path/
9. 递归复制目录
递归复制整个目录(-r)。
scp -r /local/dir/ user@remote-host:/remote/path/
10. 复制符号链接
递归复制并跟随符号链接(-r -L)。
scp -r -L /local/dir/ user@remote-host:/remote/path/
二、远程间复制与跳板
11. 通过本地跳板复制
通过本地主机复制两远程间文件(-3)。
scp -3 user1@host1:/file user2@host2:/path/
12. 使用代理跳板
使用SSH代理跳板复制(-o ProxyCommand)。
scp -o ProxyCommand="ssh user@jump-host nc %h %p" /local/file user@remote-host:/path/
13. 链式跳板复制
链式多跳板复制文件(-o ProxyJump)。
scp -o ProxyJump="user@jump1,user@jump2" /local/file user@remote-host:/path/
14. 远程到远程复制
直接远程到远程复制,无需本地中转(需SSH配置)。
scp user@host1:/file user@host2:/path/
15. 跳板限速复制
通过跳板复制并限制带宽(-l),单位:Kbit/s。
scp -o ProxyCommand="ssh user@jump-host nc %h %p" -l 1024 /local/file user@remote-host:/path/
理想情况下会以128KB/s的速度复制。
16. 跳板压缩复制
通过跳板复制并启用压缩(-C -o)。
scp -C -o ProxyJump="user@jump-host" /local/file user@remote-host:/path/
17. 多跳板密钥认证
多跳板使用不同密钥认证(-i -o)。
scp -i key1 -o ProxyJump="user@jump1" -i key2 /local/file user@remote-host:/path/
18. 跳板安静模式
通过跳板安静复制(-q -o)。
scp -q -o ProxyCommand="ssh -q user@jump-host nc %h %p" /local/file user@remote-host:/path/
19. 远程间递归复制
远程间递归复制目录(-r)。
scp -r user@host1:/dir/ user@host2:/path/
20. 跳板详细调试
通过跳板详细调试复制(-v -o)。
scp -v -o ProxyJump="user@jump-host" /local/file user@remote-host:/path/
三、性能优化与限制
21. 限速复制
限制带宽为12.8KB/s复制(-l 100),单位:Kbit/s。
scp -l 100 /local/file user@remote-host:/remote/path/
22. 指定加密算法
指定加密算法加速复制(-c)。
scp -c aes128-ctr /local/file user@remote-host:/remote/path/
23. 批量复制文件
批量复制多个文件(空格分隔)。
scp /file1 /file2 user@remote-host:/path/
24. 使用批处理模式
批处理模式复制,避免交互(-B)。
scp -B /local/file user@remote-host:/remote/path/
25. IPv4强制复制
强制使用IPv4地址(-4)。
scp -4 /local/file user@remote-host:/remote/path/
26. IPv6强制复制
强制使用IPv6地址(-6)。
scp -6 /local/file user@remote-host:/remote/path/
27. 压缩级别优化
指定压缩级别复制(-o CompressionLevel)。
scp -o CompressionLevel=9 /local/file user@remote-host:/remote/path/
28. 限速递归复制
限速递归复制目录(-l -r)。
scp -l 500 -r /local/dir/ user@remote-host:/remote/path/
29. 加密算法与压缩组合
组合加密和压缩优化(-c -C)。
scp -c aes256-gcm@openssh.com -C /local/file user@remote-host:/remote/path/
30. 批量限速复制
批量文件限速复制(-l)。
scp -l 200 /file1 /file2 user@remote-host:/path/
四、文件排除与模式匹配
31. 排除特定文件复制
使用rsync-like排除模式(需rsync over scp,但scp无内置,使用find)。
find /local/dir/ -type f ! -name "*.tmp" | xargs -I {} scp {} user@remote-host:/remote/path/
32. 模式匹配复制
复制匹配模式的文件(如*.txt)。
scp /local/*.txt user@remote-host:/remote/path/
33. 递归排除子目录
递归复制但排除子目录(find + xargs)。
find /local/dir/ -type f ! -path "*/exclude/*" | xargs -I {} scp {} user@remote-host:/remote/path/
34. 排除隐藏文件
排除隐藏文件递归复制(find -not -name)。
find /local/dir/ -type f -not -name ".*" | xargs -I {} scp {} user@remote-host:/remote/path/
35. 模式与限速组合
模式匹配限速复制(-l)。
scp -l 100 /local/*.log user@remote-host:/remote/path/
36. 排除大文件复制
排除大于1M文件复制(find -size)。
find /local/dir/ -type f -size -1M | xargs -I {} scp {} user@remote-host:/remote/path/
37. 正则模式排除
使用grep过滤路径排除(find | grep -v)。
find /local/dir/ | grep -v "\.bak$" | xargs -I {} scp {} user@remote-host:/remote/path/
38. 模式递归复制
递归复制匹配模式目录(-r *.dir)。
scp -r /local/dir* user@remote-host:/remote/path/
39. 排除时间戳文件
排除旧文件复制(find -mtime)。
find /local/dir/ -type f -mtime -7 | xargs -I {} scp {} user@remote-host:/remote/path/
40. 复杂模式组合
组合模式和排除复制(find + !)。
find /local/dir/ \( -name "*.txt" -o -name "*.log" \) ! -name "*old*" | xargs -I {} scp {} user@remote-host:/remote/path/
五、认证与配置选项
41. 使用SSH配置文件
使用自定义SSH config复制(-F)。
scp -F ~/.ssh/custom_config /local/file user@remote-host:/remote/path/
42. 指定SSH程序
使用自定义SSH程序复制(-S)。
scp -S /usr/bin/ssh /local/file user@remote-host:/remote/path/
43. 批处理密钥认证
批处理模式密钥认证复制(-B -i)。
scp -B -i ~/.ssh/id_ed25519 /local/file user@remote-host:/remote/path/
44. 配置选项覆盖
覆盖SSH选项复制(-o)。
scp -o StrictHostKeyChecking=no /local/file user@remote-host:/remote/path/
45. 多选项组合
多SSH选项组合复制(-o)。
scp -o ConnectTimeout=10 -o ServerAliveInterval=60 /local/file user@remote-host:/remote/path/
46. 配置端口与密钥
配置端口和密钥复制(-P -i)。
scp -P 2222 -i key.pem /local/file user@remote-host:/remote/path/
47. 禁用主机检查
禁用主机密钥检查复制(-o)。
scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no /local/file user@remote-host:/remote/path/
48. 指定加密与配置
指定加密算法与配置复制(-o Cipher)。
scp -o Cipher=aes128-cbc /local/file user@remote-host:/remote/path/
49. 代理与认证组合
代理跳板与密钥认证(-o -i)。
scp -o ProxyJump=user@jump-host -i key.pem /local/file user@remote-host:/path/
50. 复杂配置脚本
从脚本读取配置复制(ssh -F config)。
scp -S "ssh -F custom.config" /local/file user@remote-host:/path/
2.rsync差异化传输(支持断点续传,数据同步)
rsync -av /backup/ -e ssh root@192.168.1.110:/freeoa
#-a: archive归档模式,表示以递归方式传输文件,并保持所有文件属性,链接等,等同于-rlptgoD
rsync -- remote sync。rsync是Linux系统下的文件同步和数据传输工具,它采用“rsync”算法,可以将一个客户机和远程文件服务器之间的文件同步,也可以在本地系统中将数据从一个分区备份到另一个分区上。如果rsync在备份过程中出现了数据传输中断,恢复后可以继续传输不一致的部分。rsync可以执行完整备份或增量备份。它的主要特点有:
1).可以镜像保存整个目录树和文件系统;
2).可以很容易做到保持原来文件的权限、时间、软硬链接;无须特殊权限即可安装;
3).可以增量同步数据,文件传输效率高,因而同步时间短;
4).可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接;
5).支持匿名传输,以方便进行网站镜象等;
6).加密传输数据,保证了数据的安全性;
3.nc传输(一种网络的数据流重定向)
nc所做的就是在两台电脑之间建立tcp或udp链接,并在两个端口之间传输数据流,是一种网络的数据流重定向。
#使用dd结合nc命令网络克隆磁盘分区
主机:
dd if=/dev/vda | gzip -c | nc -l 50522
待恢复机:
nc 192.168.0.63 50522 | gzip -dc | dd of=/dev/sdN
#dd命令克隆/dev/vda磁盘,并使用gzip压缩,把数据流重定向到本机50522端口,待恢复机上使用nc连接主机50522端口,就能接收主机50522端口的比特数据流,然后使用gzip解压缩,并恢复到/dev/sda磁盘。
#dd命令读取的是磁盘扇区,所以不论磁盘文件系统,或者分区表,磁盘MBR信息,dd都能够复制,可以使用bs,count参数控制要克隆的大小
#例如dd bs=512 count=1 if=/dev/vda of=mbr.img 只复制磁盘vda的第一个扇区512K字节数据(引导程序和分区表)
4.管道传输(降低IO开销)
gzip -c sda.img | ssh root@192.168.1.11 "gunzip -c - > /image/sda.img"
#对sda.img使用gzip压缩,-c参数表示输出到stdout,即为通过管道传送做准备
#gunzip -c - 中的"-"表示接收从管道传进的sdtin
5.建立文件服务器
像使用ftp、samba、nfs、rsync服务器等。
1.数据传输模式不合理
不考虑文件自身的内容,一味使用ASCII模式传输数据是不合理的。文件传输协议(FTP)应该具有自动检测功能,当然用户也可以进行自定义。
虽然现在许多Linux和Windows客户端已经支持自动传输模式,但多达数代的UNIX和Windows客户端都默认使用ASCII传输模式,这种传输模式甚至会造成文件损坏。
2.工作方式设计不合理
文件传输协议(FTP)可以在主动模式(PORT)或被动模式(PASV)下工作,这决定了数据链接建立的方式。
在主动模式下,客户端首先向服务器端发送IP地址和端口号,然后等待服务器端建立TCP链接。在被动模式下,客户端同样首先建立到服务器的链接,但服务器端会开启一个端口(1024到5000之间),等待客户端传输数据。
文件传输协议(FTP)中最让人不可思议的是,客户端会侦听服务器端!
3.与防火墙工作不协调
在文件传输协议(FTP)诞生在网络地址转换(NAT)和防火墙之前,那时的网络还不存在恶意攻击。今天大多数最终用户的IPv4地址已不可路由,这是因为防火墙的使用和IPv4地址的短缺。
这对FTP意味着什么呢?这意味着如果FTP客户端IP地址不可路由,或者位于防火墙之后,那么就只能使用被动传输模式进行数据传输。
如果服务器端的IP地址也不可路由,或者位于防火墙之后呢?FTP将无法进行数据传输!现在,许多防火墙适用于NAT环境,可以使用一些特殊的技巧(hacks)允许FTP在防火墙之后正常工作。当然这需要对防火墙进行配置。
4.密码安全策略不完善
在互联网早期,文件传输协议(FTP)并没有对密码安全作出规定。在FTP客户端和服务器端,数据以明文的形式传输,任何对通讯路径上的路由具有控制能力的人,都可以通过嗅探获取你的密码和数据。
我们当然可以使用SSL封装FTP,但FTP是通过建立多次链接进行数据传输的,我们即便是保护了密码安全,也很难保护数据传输的安全性。自文件传输协议(FTP)发布以来,安全的数据传输也经历了长足发展,推荐使用SCP取代FTP进行文件传输。
5.FTP协议效率低下
从FTP服务器上检索一个文件,包含繁复的交换握手步骤:
客户端建立到FTP服务器端控制端口的TCP Socket链接,并等待TCP握手完成
客户端等待服务器端发送回执
客户端向服务器端发送用户名并等待响应
客户端向服务器端发送密码并等待响应
客户端向服务器端发送SYST命令并等待响应
客户端向服务器端发送TYPE I命令并等待响应
如果用户需要在服务器端切换目录,客户端仍然发送命令并等待响应
主动模式下,客户端需要发送PORT命令到服务器端,然后等待响应(被动模式与主动模式相反)
建立数据传输链接(需要经过三次握手,建立一条TCP Socket连接)
通过链接传输数据
客户端等待服务器端从控制连接发送2xx指令,以确保数据传输成功
客户端发送QUIT命令,并等待服务器响应
同样的情形,我们来看看HTTP协议:
HTTP客户端向HTTP服务器端建立一条TCP Socket连接
HTTP客户端向HTTP服务器端发送GET命令,包含URL、HTTP协议版本、虚拟主机名等等,并等待响应
HTTP服务器端的响应包含了所有想要的数据,完成!
传输一个文件,FTP需要往复10次,而HTTP只需要2次!如果传输多个文件,FTP可以省略发送用户名和密码的步骤,而HTTP则可以使用固定的套接字(Socket),在相同的TCP连接中传输文件。
综上所述,虽然文件传输协议(FTP)曾经显赫一时,但现在已经过时了,它是一个既不不安全,也不不友好,而且效率低下的协议,势必被取而代之。
FTP和HTTP协议的比较
1、HTTP协议是用来浏览网站的,而FTP是用来访问和传输文件的,FTP文件传输有点批量上传和维护网站的意思,而HTTP文件传输更多的是为终端用户提供文件传输,比如电影、图片、音乐之类。
2、HTTP 和 FTP 客户端:通常的HTTP客户端就是浏览器,而FTP服务可以通过命令行或者用户自有的图形界面客户端。
3、HTTP 头:HTTP 头包含了 metadata ,比如说最后更改的日期、编码方式、服务器名称版本还有其他的一些信息,而这些在FTP中是不存在的。
4、FTP要比HTTP早出现10年左右。
5、数据格式:FTP能传输ACSII数据或者二进制格式的数据,而HTTP只用二进制格式。
6、HTTP中的流水线:HTTP支持流水线,这就意味着客户端可以在上一个请求处理完之前,发出下一个请求,其结果就是多次请求数据之前省掉了部分服务器客户端往返时延。而FTP并没有这项支持。
7、HTTP中的动态端口:FTP一个最大的问题就是它使用两个连接,第一个连接用来发送控制指令,当接受或者发送数据的时候,又打开第二个TCP连接。而HTTP在双向传输中使用动态端口。
8、HTTP中的持久连接:对一个HTTP会话来讲,客户端可以维护一个单个的连接并使用它进行任意数量的数据传输。FTP每次有数据的需要时都创建一个新的连接。重复的创建新的连接带来的体验并不好,因为每次创建连接都必须让双方握手验证,这消耗了很多时间。
9、HTTP中的压缩算法:HTTP提供了一个在一些压缩算法中客户端和服务器共同协商选择的办法。其中gzip可以说是最有影响力的一种,而FTP中并不存在这种复杂的算法。
10、HTTP支持代理:HTTP一个很大的特点就是支持代理,这种功能是构建在协议里的,而FTP并不支持。
11、而FTP也能脱颖而出的一点是这个协议是直接面向文件级别的。这以为着FTP有例如可以通过命令列出远程服务器上的目录列表,而HTTP没有这个概念。
12、速度:可能最通常的问题了:哪一个传输更快?
什么使FTP服务更快?
1、没有在发出的数据中加入meta-data,仅传输原二进制文件。
2、没有过度的分块编码
什么使HTTP服务更快?
1、重用已存在的持久连接,从而有更好的TCP表现。
2、流水线的支持使得从同一个服务器上请求多个文件更快。
3、自动的压缩机制使得传输的数据更少。
4、没有命令/应答机制最大限度的减少了往返时延。
总结:当然最终的结果会因具体的情况而异,但我想说的是,单次传输一个静态的文件,很难衡量两者的区别对单个的小文件来说,FTP传输更快,当传输多个文件时,HTTP更快。
盘点Linux主机之间传输文件的方法
1.scp传输
scp -r /data/file root@ip:/data/
scp -C /data/sda.img root@ip:/data/img/
#-r: 支持目录
#-C: 启用压缩传送
scp传输速度较慢,但使用ssh通道保证了传输的安全性。下面列出SCP的常见用法:
一、基本文件复制
1. 本地到远程复制
将本地文件复制到远程主机(基本用法)。
scp /local/file user@remote-host:/remote/path/
2. 远程到本地复制
将远程文件复制到本地目录。
scp user@remote-host:/remote/file /local/path/
3. 指定端口复制
使用自定义端口(如2222)复制文件(-P)。
scp -P 2222 /local/file user@remote-host:/remote/path/
4. 使用密钥认证
使用私钥文件认证复制(-i)。
scp -i ~/.ssh/id_rsa /local/file user@remote-host:/remote/path/
5. 安静模式复制
抑制进度和错误输出(-q)。
scp -q /local/file user@remote-host:/remote/path/
6. 详细模式复制
显示详细调试信息(-v)。
scp -v /local/file user@remote-host:/remote/path/
7. 启用压缩
启用压缩传输加速(-C)。
scp -C /local/file user@remote-host:/remote/path/
8. 保持文件属性
保持文件时间戳、模式和所有者(-p)。
scp -p /local/file user@remote-host:/remote/path/
9. 递归复制目录
递归复制整个目录(-r)。
scp -r /local/dir/ user@remote-host:/remote/path/
10. 复制符号链接
递归复制并跟随符号链接(-r -L)。
scp -r -L /local/dir/ user@remote-host:/remote/path/
二、远程间复制与跳板
11. 通过本地跳板复制
通过本地主机复制两远程间文件(-3)。
scp -3 user1@host1:/file user2@host2:/path/
12. 使用代理跳板
使用SSH代理跳板复制(-o ProxyCommand)。
scp -o ProxyCommand="ssh user@jump-host nc %h %p" /local/file user@remote-host:/path/
13. 链式跳板复制
链式多跳板复制文件(-o ProxyJump)。
scp -o ProxyJump="user@jump1,user@jump2" /local/file user@remote-host:/path/
14. 远程到远程复制
直接远程到远程复制,无需本地中转(需SSH配置)。
scp user@host1:/file user@host2:/path/
15. 跳板限速复制
通过跳板复制并限制带宽(-l),单位:Kbit/s。
scp -o ProxyCommand="ssh user@jump-host nc %h %p" -l 1024 /local/file user@remote-host:/path/
理想情况下会以128KB/s的速度复制。
16. 跳板压缩复制
通过跳板复制并启用压缩(-C -o)。
scp -C -o ProxyJump="user@jump-host" /local/file user@remote-host:/path/
17. 多跳板密钥认证
多跳板使用不同密钥认证(-i -o)。
scp -i key1 -o ProxyJump="user@jump1" -i key2 /local/file user@remote-host:/path/
18. 跳板安静模式
通过跳板安静复制(-q -o)。
scp -q -o ProxyCommand="ssh -q user@jump-host nc %h %p" /local/file user@remote-host:/path/
19. 远程间递归复制
远程间递归复制目录(-r)。
scp -r user@host1:/dir/ user@host2:/path/
20. 跳板详细调试
通过跳板详细调试复制(-v -o)。
scp -v -o ProxyJump="user@jump-host" /local/file user@remote-host:/path/
三、性能优化与限制
21. 限速复制
限制带宽为12.8KB/s复制(-l 100),单位:Kbit/s。
scp -l 100 /local/file user@remote-host:/remote/path/
22. 指定加密算法
指定加密算法加速复制(-c)。
scp -c aes128-ctr /local/file user@remote-host:/remote/path/
23. 批量复制文件
批量复制多个文件(空格分隔)。
scp /file1 /file2 user@remote-host:/path/
24. 使用批处理模式
批处理模式复制,避免交互(-B)。
scp -B /local/file user@remote-host:/remote/path/
25. IPv4强制复制
强制使用IPv4地址(-4)。
scp -4 /local/file user@remote-host:/remote/path/
26. IPv6强制复制
强制使用IPv6地址(-6)。
scp -6 /local/file user@remote-host:/remote/path/
27. 压缩级别优化
指定压缩级别复制(-o CompressionLevel)。
scp -o CompressionLevel=9 /local/file user@remote-host:/remote/path/
28. 限速递归复制
限速递归复制目录(-l -r)。
scp -l 500 -r /local/dir/ user@remote-host:/remote/path/
29. 加密算法与压缩组合
组合加密和压缩优化(-c -C)。
scp -c aes256-gcm@openssh.com -C /local/file user@remote-host:/remote/path/
30. 批量限速复制
批量文件限速复制(-l)。
scp -l 200 /file1 /file2 user@remote-host:/path/
四、文件排除与模式匹配
31. 排除特定文件复制
使用rsync-like排除模式(需rsync over scp,但scp无内置,使用find)。
find /local/dir/ -type f ! -name "*.tmp" | xargs -I {} scp {} user@remote-host:/remote/path/
32. 模式匹配复制
复制匹配模式的文件(如*.txt)。
scp /local/*.txt user@remote-host:/remote/path/
33. 递归排除子目录
递归复制但排除子目录(find + xargs)。
find /local/dir/ -type f ! -path "*/exclude/*" | xargs -I {} scp {} user@remote-host:/remote/path/
34. 排除隐藏文件
排除隐藏文件递归复制(find -not -name)。
find /local/dir/ -type f -not -name ".*" | xargs -I {} scp {} user@remote-host:/remote/path/
35. 模式与限速组合
模式匹配限速复制(-l)。
scp -l 100 /local/*.log user@remote-host:/remote/path/
36. 排除大文件复制
排除大于1M文件复制(find -size)。
find /local/dir/ -type f -size -1M | xargs -I {} scp {} user@remote-host:/remote/path/
37. 正则模式排除
使用grep过滤路径排除(find | grep -v)。
find /local/dir/ | grep -v "\.bak$" | xargs -I {} scp {} user@remote-host:/remote/path/
38. 模式递归复制
递归复制匹配模式目录(-r *.dir)。
scp -r /local/dir* user@remote-host:/remote/path/
39. 排除时间戳文件
排除旧文件复制(find -mtime)。
find /local/dir/ -type f -mtime -7 | xargs -I {} scp {} user@remote-host:/remote/path/
40. 复杂模式组合
组合模式和排除复制(find + !)。
find /local/dir/ \( -name "*.txt" -o -name "*.log" \) ! -name "*old*" | xargs -I {} scp {} user@remote-host:/remote/path/
五、认证与配置选项
41. 使用SSH配置文件
使用自定义SSH config复制(-F)。
scp -F ~/.ssh/custom_config /local/file user@remote-host:/remote/path/
42. 指定SSH程序
使用自定义SSH程序复制(-S)。
scp -S /usr/bin/ssh /local/file user@remote-host:/remote/path/
43. 批处理密钥认证
批处理模式密钥认证复制(-B -i)。
scp -B -i ~/.ssh/id_ed25519 /local/file user@remote-host:/remote/path/
44. 配置选项覆盖
覆盖SSH选项复制(-o)。
scp -o StrictHostKeyChecking=no /local/file user@remote-host:/remote/path/
45. 多选项组合
多SSH选项组合复制(-o)。
scp -o ConnectTimeout=10 -o ServerAliveInterval=60 /local/file user@remote-host:/remote/path/
46. 配置端口与密钥
配置端口和密钥复制(-P -i)。
scp -P 2222 -i key.pem /local/file user@remote-host:/remote/path/
47. 禁用主机检查
禁用主机密钥检查复制(-o)。
scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no /local/file user@remote-host:/remote/path/
48. 指定加密与配置
指定加密算法与配置复制(-o Cipher)。
scp -o Cipher=aes128-cbc /local/file user@remote-host:/remote/path/
49. 代理与认证组合
代理跳板与密钥认证(-o -i)。
scp -o ProxyJump=user@jump-host -i key.pem /local/file user@remote-host:/path/
50. 复杂配置脚本
从脚本读取配置复制(ssh -F config)。
scp -S "ssh -F custom.config" /local/file user@remote-host:/path/
2.rsync差异化传输(支持断点续传,数据同步)
rsync -av /backup/ -e ssh root@192.168.1.110:/freeoa
#-a: archive归档模式,表示以递归方式传输文件,并保持所有文件属性,链接等,等同于-rlptgoD
rsync -- remote sync。rsync是Linux系统下的文件同步和数据传输工具,它采用“rsync”算法,可以将一个客户机和远程文件服务器之间的文件同步,也可以在本地系统中将数据从一个分区备份到另一个分区上。如果rsync在备份过程中出现了数据传输中断,恢复后可以继续传输不一致的部分。rsync可以执行完整备份或增量备份。它的主要特点有:
1).可以镜像保存整个目录树和文件系统;
2).可以很容易做到保持原来文件的权限、时间、软硬链接;无须特殊权限即可安装;
3).可以增量同步数据,文件传输效率高,因而同步时间短;
4).可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接;
5).支持匿名传输,以方便进行网站镜象等;
6).加密传输数据,保证了数据的安全性;
3.nc传输(一种网络的数据流重定向)
nc所做的就是在两台电脑之间建立tcp或udp链接,并在两个端口之间传输数据流,是一种网络的数据流重定向。
#使用dd结合nc命令网络克隆磁盘分区
主机:
dd if=/dev/vda | gzip -c | nc -l 50522
待恢复机:
nc 192.168.0.63 50522 | gzip -dc | dd of=/dev/sdN
#dd命令克隆/dev/vda磁盘,并使用gzip压缩,把数据流重定向到本机50522端口,待恢复机上使用nc连接主机50522端口,就能接收主机50522端口的比特数据流,然后使用gzip解压缩,并恢复到/dev/sda磁盘。
#dd命令读取的是磁盘扇区,所以不论磁盘文件系统,或者分区表,磁盘MBR信息,dd都能够复制,可以使用bs,count参数控制要克隆的大小
#例如dd bs=512 count=1 if=/dev/vda of=mbr.img 只复制磁盘vda的第一个扇区512K字节数据(引导程序和分区表)
4.管道传输(降低IO开销)
gzip -c sda.img | ssh root@192.168.1.11 "gunzip -c - > /image/sda.img"
#对sda.img使用gzip压缩,-c参数表示输出到stdout,即为通过管道传送做准备
#gunzip -c - 中的"-"表示接收从管道传进的sdtin
5.建立文件服务器
像使用ftp、samba、nfs、rsync服务器等。