[Linux基础]-16-使用sftp和rsync进行文件互传

引言

这篇文章介绍替代scp的文件传输命令,sftp/rsync命令速查,覆盖日常最常用的文件传输场景。

文章目录

0×1.sftp传输文件

● 单个文件上传

					
					#上传当前目录下的local.txt到远程服务器192.168.1.233的/root/path/目录,使用远程服务器root用户登陆
					#SFTP 非交互式用 <<< $'命令' 避免进入交互界面
					987@hk987.xyz:~$ sftp root@192.168.1.233:/remote/path/ <<< $'put local.txt'
					
					

● 单个文件下载

					
					987@hk987.xyz:~$ sftp user@host:/remote/path/ <<< $'get remote.txt'
					
					

● 上传整个目录

					
					# scp/rsync 加 -r 递归,SFTP 是 put -r
					987@hk987.xyz:~$ sftp user@host:/remote/path/ <<< $'put -r local_dir/'
					
					

● 下载整个目录

					
					987@hk987.xyz:~$ sftp user@host:/remote/path/ <<< $'get -r remote_dir/'
					
					

● 指定 SSH 端口(如 2333)

					
					# scp/SFTP 用 -P(大写),rsync 需通过 ssh -p(小写)指定端口
					987@hk987.xyz:~$ sftp -P 2333 user@host:/path/ <<< $'put local.txt'
					
					

● 使用断点续传方式(暂不支持)

					
					#可以用lftp或者rsync平替
					
					

● 显示传输进度

					
					# rsync --progress 是真正的进度条,体验远优于 scp/SFTP 的 -v 日志
					987@hk987.xyz:~$ sftp -v user@host:/path/ <<< $'get bigfile.zip'
					
					

● 保留文件权限 / 属性

					
					987@hk987.xyz:~$ sftp -p user@host:/path/ <<< $'get bigfile.zip'
					
					

● 使用密钥方式传输

					
					987@hk987.xyz:~$ sftp -v -P 2333 -i ~/.ssh/vssh root@host <<< $'put local.file'
					
					

0×2.rsync传输文件

● 单个文件上传

					
					#-avz:a = 归档(保留属性,递归目录)、v=verbose(详细)、z = 压缩传输
					#rsync 本身是一个数据同步工具,它默认会尝试使用 rsh(早期的远程 shell,安全性差)作为远程连接方式,
					#而 -e 参数的作用就是覆盖这个默认行为,指定用更安全的 ssh 来建立远程连接,所有同步的数据都会通过 SSH 加密传输
					987@hk987.xyz:~$ rsync -avz -e ssh local.txt user@host:/remote/path/
					
					

● 单个文件下载

					
					987@hk987.xyz:~$ rsync -avz -e ssh user@host:/remote/path/remote.txt ./
					
					

● 上传整个目录

					
					# scp/rsync 加 -r 递归,SFTP 是 put -r,因为这里使用了-a参数,包含了-r功能,所以不需要重复指定-r
					#(重要)rsync 目录末尾加 / 表示同步目录内文件,不加则同步目录本身
					#意思是,如果不加/,那么复制过去后会在/remote/path/下多出一个local_dir文件夹,然后才是local_dir文件夹中的文件
					/remote/path/
					└── local_dir/
					    ├── file1.txt
					    └── file2.txt
					#如果加上/就仅仅只是复制local_dir下的文件,不会复制目录本身
					/remote/path/
					├── file1.txt
					└── file2.txt

					987@hk987.xyz:~$ rsync -avz -e ssh local_dir/ user@host:/remote/path/
					
					

● 下载整个目录

					
					987@hk987.xyz:~$ rsync -avz -e ssh user@host:/remote/dir/ ./
					
					

● 指定 SSH 端口(如 2333)

					
					# scp/SFTP 用 -P(大写),rsync 需通过 ssh -p(小写)指定端口
					987@hk987.xyz:~$ rsync -avz -e 'ssh -p 2333' local.txt user@host:/path/
					
					

● 使用断点续传方式

					
					987@hk987.xyz:~$ rsync -avz --partial --progress -e ssh bigfile.zip user@host:/path/
					
					

● 显示传输进度

					
					# rsync --progress 是真正的进度条,体验远优于 scp/SFTP 的 -v 日志
					987@hk987.xyz:~$ rsync -avz --progress -e ssh local.txt user@host:/path/
					
					

● 保留文件权限 / 属性

					
					# rsync -a 已包含权限 / 时间戳保留,无需额外参数
					987@hk987.xyz:~$ rsync -avz -e ssh local.txt user@host:/path/
					
					

● 使用密钥传输

					
					# 上传 local_dir 到服务器 /home/user/
					# SSH 对密钥权限很严格,不然会连不上 chmod 600 ~/.ssh/id_rsa
					987@hk987.xyz:~$ rsync -avz -e "ssh -i ~/.ssh/id_rsa" ./local_dir user@192.168.1.100:/home/user/