scp
scp 是 Linux 中用于在本地和远程主机之间安全复制文件的命令,其名称来源于 Secure Copy(安全复制)。它基于 SSH 协议,所有传输的数据都经过加密。
1. 基本语法
scp [选项] 源文件 目标路径
源或目标中如果包含 :,就表示远程主机。
# 本地 → 远程
scp 本地文件 用户名@远程IP:远程路径
# 远程 → 本地
scp 用户名@远程IP:远程文件 本地路径
2. 常用操作
① 本地文件复制到远程
scp file.txt zzw@10.1.8.10:/home/zzw/
② 远程文件复制到本地
scp zzw@10.1.8.10:/home/zzw/file.txt ./
③ 复制整个目录(必须加 -r)
scp -r my_folder/ zzw@10.1.8.10:/home/zzw/
④ 远程 → 远程(通过本地中转)
scp zzw@10.1.8.10:/home/zzw/file.txt zzw@10.1.8.20:/home/zzw/
⑤ 指定 SSH 端口(默认 22)
scp -P 2222 file.txt zzw@10.1.8.10:/home/zzw/
注意:scp 的端口选项是大写 -P,而 ssh 是小写 -p。
3. 常用选项
| -r | 递归复制整个目录 | scp -r folder/ user@host:/tmp/ |
| -P 端口 | 指定 SSH 端口 | scp -P 2222 file.txt user@host:/tmp/ |
| -p | 保留文件权限、时间戳 | scp -p file.txt user@host:/tmp/ |
| -C | 传输时压缩 | scp -C file.txt user@host:/tmp/ |
| -i 私钥 | 指定私钥文件 | scp -i ~/.ssh/id_rsa file.txt user@host:/tmp/ |
| -l 带宽 | 限制带宽(Kbit/s) | scp -l 800 file.txt user@host:/tmp/ |
| -v | 显示调试信息 | scp -v file.txt user@host:/tmp/ |
4. 实战示例
① 上传网站文件到服务器
scp -r /var/www/html/ zzw@10.1.8.10:/var/www/
② 从服务器下载日志
scp zzw@10.1.8.10:/var/log/nginx/access.log ./
③ 使用密钥免密传输
scp -i ~/.ssh/id_rsa backup.tar.gz zzw@10.1.8.10:/backup/
④ 限制带宽,避免占满网络
scp -l 800 bigfile.iso zzw@10.1.8.10:/backup/
⑤ 配合 ~/.ssh/config 使用别名
如果你在 ~/.ssh/config 中配置了别名:
Host server
HostName 10.1.8.10
User zzw
Port 22
就可以直接用别名:
scp file.txt server:/home/zzw/
5. scp vs rsync
| 传输方式 | 全量传输 | 增量传输(只传变化部分) |
| 速度 | 较慢(每次全传) | 较快(断点续传、增量) |
| 功能 | 简单复制 | 支持排除、删除、镜像、压缩 |
| 适用场景 | 少量文件、简单传输 | 大量文件、定期备份 |
| 命令示例 | scp file.txt user@host:/tmp/ | rsync -avz file.txt user@host:/tmp/ |
结论:临时传几个文件用 scp,定期备份或大量文件用 rsync。
6. scp vs sftp
| 交互方式 | 非交互,一条命令完成 | 交互式,类似 FTP |
| 适用场景 | 脚本、自动化 | 手动浏览、上传下载 |
| 命令示例 | scp file.txt user@host:/tmp/ | sftp user@host 后 put file.txt |
7. 常见问题
| Permission denied | 目标目录无写权限 | 检查目标目录权限,或用 sudo |
| No such file or directory | 路径写错 | 确认远程路径存在 |
| Connection refused | SSH 服务未启动或端口不对 | 检查 sshd 状态和端口 |
| Host key verification failed | 主机密钥变更 | 删除 known_hosts 中对应行 |
| 传输速度慢 | 网络带宽限制 | 加 -C 压缩,或用 rsync |
8. 一句话总结
scp = SSH + 文件复制:
- 上传:scp 本地文件 user@host:远程路径
- 下载:scp user@host:远程文件 本地路径
- 目录:加 -r
- 端口:加 -P(大写)
- 密钥:加 -i
临时传文件用 scp,定期备份用 rsync。
rsync
1. 基本语法
rsync [选项] 源路径 目标路径
源或目标中如果包含 :,就表示远程主机。
# 本地同步
rsync 源目录/ 目标目录/
# 本地 → 远程
rsync 本地目录/ 用户名@远程IP:远程目录/
# 远程 → 本地
rsync 用户名@远程IP:远程目录/ 本地目录/
2. 核心选项(必记)
| -a | 归档模式,保留权限、时间、所有者、符号链接等(最常用) |
| -v | 显示详细过程 |
| -z | 传输时压缩,节省带宽 |
| -h | 人类可读格式(文件大小显示为 K/M/G) |
| -P | 显示进度 + 支持断点续传(等于 –partial –progress) |
| –delete | 删除目标中源没有的文件,保持完全一致 |
| –exclude | 排除指定文件或目录 |
| -e ssh | 通过 SSH 传输 |
| -n | 模拟运行(dry-run),不实际传输,用于测试 |
黄金组合:rsync -avhP,日常使用几乎离不开它。
3. 关键:源路径末尾的 /
这是 rsync 最容易踩的坑,必须理解:
| /home/zzw/ | 同步 zzw 目录里面的内容 | 目标下直接是文件 |
| /home/zzw | 同步 zzw 目录本身 | 目标下会创建 zzw 目录 |
示例:
# 目标下直接是文件
rsync -avh /home/zzw/ /backup/
# 结果:/backup/file1, /backup/file2
# 目标下会创建 zzw 目录
rsync -avh /home/zzw /backup/
# 结果:/backup/zzw/file1, /backup/zzw/file2
4. 常用操作
① 本地同步(保留属性)
rsync -avh /home/zzw/ /backup/zzw/
② 本地镜像(目标与源完全一致)
rsync -avh –delete /home/zzw/ /backup/zzw/
③ 远程同步(通过 SSH)
rsync -avhz -e ssh /home/zzw/ zzw@10.1.8.10:/backup/zzw/
④ 从远程拉取
rsync -avhz -e ssh zzw@10.1.8.10:/backup/zzw/ /home/zzw/
⑤ 排除文件
rsync -avh –exclude="*.log" –exclude="cache" /home/zzw/ /backup/zzw/
⑥ 显示进度,支持断点续传
rsync -avhP /home/zzw/ /backup/zzw/
⑦ 先模拟,确认无误再执行
rsync -avhn –delete /home/zzw/ /backup/zzw/
5. rsync 为什么快?
增量传输是核心。它对比源和目标,只传输:
- 新增的文件
- 修改过的文件
- 文件中有变化的部分(使用 –delta 算法)
对比 cp:
| 第一次同步 | 全量复制 | 全量复制 |
| 第二次同步(少量变化) | 全量复制 | 只传变化部分 |
| 断点续传 | ❌ 不支持 | ✅ 支持 |
| 远程传输 | ❌ 不支持 | ✅ 支持 |
6. rsync vs scp
| 传输方式 | 全量 | 增量 |
| 速度 | 每次全传,慢 | 只传差异,快 |
| 断点续传 | ❌ 不支持 | ✅ 支持 |
| 排除文件 | ❌ 不支持 | ✅ 支持 |
| 删除同步 | ❌ 不支持 | ✅ 支持(–delete) |
| 适用场景 | 少量文件、临时传输 | 大量文件、定期备份 |
7. 实战场景
① 网站目录备份到远程
rsync -avhz –delete -e ssh /var/www/html/ zzw@backup-server:/backup/www/
② 本地定期备份(配合 cron)
# 每天凌晨 2 点同步
0 2 * * * rsync -avh –delete /home/zzw/ /backup/zzw/
③ 排除日志和缓存
rsync -avh –exclude="*.log" –exclude=".cache" /home/zzw/ /backup/zzw/
④ 使用 ~/.ssh/config 别名
# ~/.ssh/config 中定义 server 别名后
rsync -avhz /home/zzw/ server:/backup/zzw/
⑤ 限速传输(避免占满带宽)
rsync -avh –bwlimit=1000 /home/zzw/ /backup/zzw/
# 限制为 1000 KB/s
8. 常见问题
| 目标多了源没有的文件 | 没用 –delete | 加 –delete |
| 权限报错 | 目标目录无写权限 | 检查权限,或用 sudo |
| 传输速度慢 | 没加 -z 或网络差 | 加 -z,或用 –bwlimit 限速 |
| 符号链接没保留 | 没用 -a | 加 -a(-a 包含 -l) |
| 误删文件 | –delete 太危险 | 先用 -n 模拟,确认后再执行 |
9. 一句话总结
rsync = 增量同步 + 远程传输 + 备份神器:
- 日常用:rsync -avhP 源/ 目标/
- 镜像同步:加 –delete
- 远程传输:加 -e ssh
- 排除文件:加 –exclude
- 先模拟:加 -n
记住源路径末尾的 / 决定“同步内容”还是“同步目录本身”。 定期备份首选 rsync,临时传文件用 scp
Linux 软件包管理
Linux 软件包管理是运维的核心技能之一,不同发行版使用不同的包管理工具。掌握它们,你就能在任意 Linux 系统上安装、更新、卸载软件。
一、两大主流包管理体系
| RPM 体系 | CentOS、RHEL、Fedora、Rocky | .rpm | yum、dnf、rpm |
| DEB 体系 | Ubuntu、Debian | .deb | apt、dpkg |
核心区别:
- RPM:Red Hat 系,包管理严格,依赖自动解决(yum/dnf)。
- DEB:Debian 系,包管理灵活,依赖自动解决(apt)。
二、RPM 体系(CentOS/RHEL)
1. rpm — 底层包管理工具
rpm 直接操作 .rpm 包,不自动解决依赖。
# 安装
sudo rpm -ivh package.rpm
# 升级
sudo rpm -Uvh package.rpm
# 卸载
sudo rpm -e package_name
# 查询已安装的包
rpm -qa | grep nginx
# 查询包信息
rpm -qi nginx
# 查询包安装了哪些文件
rpm -ql nginx
# 查询某个文件属于哪个包
rpm -qf /usr/sbin/nginx
缺点:依赖需要手动解决,容易报错 Failed dependencies。
2. yum — 高层包管理工具(CentOS 7)
yum 自动从仓库下载并解决依赖。
# 安装
sudo yum install nginx
# 卸载
sudo yum remove nginx
# 更新
sudo yum update nginx
sudo yum update # 更新所有
# 搜索
yum search nginx
# 查看包信息
yum info nginx
# 列出已安装
yum list installed | grep nginx
# 清理缓存
sudo yum clean all
# 查看仓库
yum repolist
3. dnf — 新一代包管理工具(CentOS 8+ / Rocky)
dnf 是 yum 的升级版,命令基本兼容,但更快、更智能。
sudo dnf install nginx
sudo dnf remove nginx
sudo dnf update
dnf search nginx
dnf info nginx
dnf repolist
注意:CentOS 8+ 中 yum 是 dnf 的软链接,用哪个都一样。
4. yum/dnf 常用选项
| -y | 自动确认,不询问 |
| –nogpgcheck | 跳过 GPG 校验(不推荐) |
| –enablerepo=仓库名 | 临时启用某个仓库 |
| –disablerepo=仓库名 | 临时禁用某个仓库 |
| –downloadonly | 只下载不安装 |
示例:
sudo yum install -y nginx
sudo yum install –downloadonly –downloaddir=/tmp nginx
5. 仓库配置
位置: /etc/yum.repos.d/
示例:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
添加仓库:
# 方式一:手动创建 .repo 文件
sudo vim /etc/yum.repos.d/nginx.repo
# 方式二:用 yum-config-manager
sudo yum-config-manager –add-repo http://nginx.org/packages/centos/7/x86_64/
三、DEB 体系(Ubuntu/Debian)
1. dpkg — 底层包管理工具
# 安装
sudo dpkg -i package.deb
# 卸载
sudo dpkg -r package_name
# 查询已安装
dpkg -l | grep nginx
# 查询包安装了哪些文件
dpkg -L nginx
# 查询某个文件属于哪个包
dpkg -S /usr/sbin/nginx
缺点:同样不自动解决依赖。
2. apt — 高层包管理工具
# 更新软件源索引(必须先执行)
sudo apt update
# 安装
sudo apt install nginx
# 卸载(保留配置)
sudo apt remove nginx
# 卸载(删除配置)
sudo apt purge nginx
# 升级已安装的包
sudo apt upgrade
# 搜索
apt search nginx
# 查看包信息
apt show nginx
# 列出已安装
apt list –installed | grep nginx
# 清理无用包
sudo apt autoremove
sudo apt autoclean
3. 软件源配置
位置: /etc/apt/sources.list 和 /etc/apt/sources.list.d/
示例:
deb http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
换国内源(阿里云):
sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
sudo apt update
四、两种体系对比
| 更新索引 | yum makecache | apt update |
| 安装 | yum install 包名 | apt install 包名 |
| 卸载 | yum remove 包名 | apt remove 包名 |
| 升级 | yum update 包名 | apt upgrade 包名 |
| 搜索 | yum search 关键词 | apt search 关键词 |
| 查看信息 | yum info 包名 | apt show 包名 |
| 列出已安装 | yum list installed | apt list –installed |
| 清理缓存 | yum clean all | apt clean |
| 仓库目录 | /etc/yum.repos.d/ | /etc/apt/sources.list.d/ |
| 本地包安装 | rpm -ivh | dpkg -i |
五、源码编译安装
有些软件没有现成的包,需要从源码编译安装。
标准流程
# 1. 下载源码
wget https://example.com/software.tar.gz
# 2. 解压
tar -xzvf software.tar.gz
cd software/
# 3. 配置
./configure –prefix=/usr/local/software
# 4. 编译
make
# 5. 安装
sudo make install
依赖准备
# CentOS
sudo yum groupinstall "Development Tools"
sudo yum install gcc make autoconf
# Ubuntu
sudo apt install build-essential
六、二进制安装
有些软件提供预编译的二进制包,直接解压即可使用。
# 下载
wget https://example.com/software-linux-amd64.tar.gz
# 解压
tar -xzvf software-linux-amd64.tar.gz -C /usr/local/
# 创建软链接
sudo ln -sf /usr/local/software/bin/software /usr/local/bin/software
# 验证
software –version
示例:
- Docker:二进制安装
- Kubernetes:二进制安装
- etcd:二进制安装
七、三种安装方式对比
| 包管理器 | 自动解决依赖,方便升级 | 版本可能较旧 | 日常软件安装 |
| 源码编译 | 可定制,版本最新 | 耗时,依赖需手动解决 | 需要特定版本或定制功能 |
| 二进制安装 | 快速,无需编译 | 不自动解决依赖 | 官方提供二进制的软件 |
八、实战场景
场景一:安装 Nginx
# CentOS
sudo yum install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx
# Ubuntu
sudo apt update
sudo apt install -y nginx
sudo systemctl start nginx
场景二:安装指定版本的软件
# CentOS:查看可用版本
yum list nginx –showduplicates
# 安装指定版本
sudo yum install nginx-1.20.1
# Ubuntu
sudo apt install nginx=1.18.0-0ubuntu1
场景三:本地 RPM 包安装
# 下载 rpm 包
wget https://example.com/package.rpm
# 安装(自动解决依赖)
sudo yum localinstall package.rpm
# 或
sudo rpm -ivh package.rpm
场景四:查找命令属于哪个包
# CentOS
yum provides /usr/sbin/nginx
# Ubuntu
apt-file search /usr/sbin/nginx
九、常见问题
| Failed dependencies | 依赖未满足 | 用 yum/apt 自动解决,或手动安装依赖 |
| Could not resolve host | DNS 问题 | 检查 /etc/resolv.conf |
| GPG key retrieval failed | GPG 密钥问题 | 导入密钥:rpm –import 密钥URL |
| No package available | 仓库中没有该包 | 添加第三方仓库,或源码编译 |
| Disk space full | 磁盘满 | df -h 检查,清理缓存 |
| Transaction check error | 包冲突 | 先卸载冲突的包,再安装 |
十、一句话总结
Linux 软件包管理 = 包管理器 + 仓库 + 依赖解决:
| RPM | yum install | yum remove | yum search | yum update |
| DEB | apt install | apt remove | apt search | apt upgrade |
日常用包管理器,特殊需求用源码编译,官方二进制直接解压。



