文件传输

NFS、Rsync、SFTP、SCP、Lrzsz 之类文件传输教程

NFS (Network File System)

结合视频食用: YouTube 哔哩哔哩

服务端配置

安装 NFS 服务端

terminal
apt update
apt install nfs-kernel-server -y

创建共享目录

terminal
mkdir -p /srv/nfs/share
chown nobody:nogroup /srv/nfs/share
chmod 777 /srv/nfs/share

配置导出目录

编辑/etc/exports 文件,添加以下配置

terminal
# rw:读写
# async:异步写,提高性能
# insecure:允许客户端使用 非特权端口 (>1024)
# no_subtree_check:禁用子目录检查,减少开销
# no_root_squash:允许 root 用户不被降级

# 允许所有客户端 IP 访问
/srv/nfs/share *(rw,async,insecure,no_subtree_check,no_root_squash)

# 限定某个子网
/srv/nfs/share 192.168.1.0/24(rw,async,insecure,no_subtree_check,no_root_squash)

# 限定多个子网
/srv/nfs/share 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash) 10.0.0.0/16(rw,async,no_subtree_check,no_root_squash)

# 限定单个 IP
/srv/nfs/share 192.168.1.10(rw,async,no_subtree_check,no_root_squash)

# 支持主机名
/srv/nfs/share nfs.digvps.com(rw,async,no_subtree_check,no_root_squash)

应用配置并启动

terminal
exportfs -ra
exportfs -v # 查看启用的共享
systemctl enable nfs-server
systemctl restart nfs-server

客户端配置

安装 NFS 客户端

terminal
apt update
apt install nfs-common -y

创建挂载点

terminal
mkdir -p /mnt/nfs_share

挂载

terminal
# vers=4.2:强制使用 NFSv4.2,性能和特性最好
# tcp:使用 TCP 协议
# nconnect=8:并行 8 个 TCP 连接,大幅提高多线程 IO 性能(Linux 内核 ≥ 5.3)
    
mount -o vers=4.2,tcp,nconnect=8 192.168.1.10:/srv/nfs/share /mnt/nfs_share

卸载

terminal
umount /mnt/nfs_share

开机自动挂载(可选)

编辑/etc/fstab文件添加以下内容

terminal
192.168.1.10:/srv/nfs/share /mnt/nfs_share nfs vers=4.2,tcp,nconnect=8 0 0

测试

terminal
mount -a

文件传输

Rsync

结合视频食用: YouTube 哔哩哔哩

terminal
# -a   归档模式,保留权限、时间戳等属性  
# -v   显示详细输出  
# -z   传输时压缩数据  
# --delete  删除目标中源目录没有的文件  

# 将本地文件传到远程服务器(push)
rsync -avz --delete ./dist/ 服务器的用户名@服务器的IP:/var/www/digvps/dist/

# 将远程文件传输到本地(pull)
rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine

# 指定 ssh 端口
rsync -avz -e "ssh -p $port" /local/path/ user@remoteip:/path/to/files/

# 设置备份带宽
rsync --bwlimit=100 -avzhe ssh /var/lib/rpm/ root@remoteip:/root/tmprpm/

SFTP(Secret File Transfer Protocol)

结合视频食用: YouTube 哔哩哔哩

交互模式

连接服务器

terminal
sftp root@47.254.16.58

常用操作

terminal
pwd          # 显示远程服务器当前目录  
lpwd         # 显示本地机器当前目录  

ls           # 列出远程目录文件  
lls          # 列出本地目录文件  

cd /var/www  # 切换远程目录  
lcd ./dist   # 切换本地目录  

get file.txt          # 下载远程文件到本地  
get -r dist/          # 递归下载整个目录  

put file.txt          # 上传本地文件到远程  
put -r dist/          # 递归上传整个目录  

mkdir test            # 在远程创建目录  
rmdir test            # 删除远程目录  
rm file.txt           # 删除远程文件  

rename old.txt new.txt  # 重命名远程文件  
chmod 644 file.txt      # 修改远程文件权限

退出 sftp 会话

terminal
sftp> exit

非交互模式

管道传输

terminal
# 上传单个文件
echo "put ./dist/index.html /var/www/digvps/" | sftp 用户名@服务器IP

# 上传整个目录
echo "put -r ./dist /var/www/digvps/" | sftp 用户名@服务器IP

SCP (Secure Copy Protocol)

结合视频食用: YouTube 哔哩哔哩

terminal
# 上传文件到服务器
scp ./index.html 用户名@服务器IP:/var/www/digvps/

# 上传整个目录
scp -r ./dist 用户名@服务器IP:/var/www/digvps/

# 下载文件到本地
scp 用户名@服务器IP:/var/www/digvps/config.json ./config.json

# 下载整个目录
scp -r 用户名@服务器IP:/var/www/digvps/dist ./dist_backup

# 指定端口(比如 2222)
scp -P 2222 ./index.html 用户名@服务器IP:/var/www/digvps/

# 使用 SSH key
scp -i ~/.ssh/id_rsa ./index.html 用户名@服务器IP:/var/www/digvps/

# 服务器之间直接拷贝(不经过本地)
scp 用户1@服务器1:/var/www/digvps/file.txt 用户2@服务器2:/var/www/backup/

lrzsz

结合视频食用: YouTube 哔哩哔哩

安装

terminal
apt install lrzsz

使用

terminal
# 从本地上传文件到服务器
rz

# 从服务器下载文件到本地
sz

未集成 ZMODEM 协议终端配置(可选)

Xshell、SecureCRT 等终端自带对 ZMODEM 协议的支持,可直接进行文件传输。但并非所有终端都支持该协议,这里以 macOS 下的 iTerm2 为例,展示其配置方法。

  1. 将iterm2-zmodem项目中的iterm2-send-zmodem.sh和iterm2-recv-zmodem.sh放到/usr/local/bin/目录
  2. 在iTerm2里面的Trigger(Preferences->Profiles->Advanced) 中进行以下配置
terminal
Regular expression: rz waiting to receive.\*\*B0100
Action: Run Silent Coprocess
Parameters: /usr/local/bin/iterm2-send-zmodem.sh
Instant: checked

Regular expression: \*\*B00000000000000
Action: Run Silent Coprocess
Parameters: /usr/local/bin/iterm2-recv-zmodem.sh
Instant: checked

Samba

基础共享

安装 Samba

terminal
apt update
apt install samba -y

新增账号

terminal
# 新增系统账号
useradd digvps

# 设置 SMB 密码
smbpasswd -a digvps

设置目录权限

terminal
chown digvps:digvps /mnt/md1

配置

terminal
vi /etc/samba/smb.conf

# 添加一下内容
[digvps]
   comment = Printer Drivers
   path = /mnt/md1
   browseable = yes
   read only = no
   valid users = digvps
   guest ok = no

启动 smb 服务

terminal
systemctl restart smb
systemctl restart nmb