高频工具 - 每天使用
这些是后端开发者几乎每天都会用到的 Linux 工具,务必熟练掌握
一、远程连接工具
1.1 SSH (Secure Shell)
是什么?
SSH(Secure Shell)是一种加密的网络协议,用于在不安全的网络上安全地操作远程计算机。它是后端开发者连接服务器的首选方式。
为什么需要它?
- 所有生产服务器都通过 SSH 管理
- 传输过程加密,防止密码被窃取
- 支持密钥认证,比密码更安全
- 可以执行远程命令、传输文件、端口转发
基础用法
# 基本连接(使用密码)
ssh username@hostname
ssh root@192.168.1.100
ssh deploy@myserver.com
# 指定端口(默认22)
ssh -p 2222 username@hostname
# 使用密钥连接
ssh -i ~/.ssh/my_key.pem ubuntu@ec2-xxx.amazonaws.com
# 执行单条命令(不进入交互模式)
ssh user@host "ls -la /var/log"
ssh user@host "cat /etc/nginx/nginx.conf"
# 执行多条命令
ssh user@host "cd /var/www && git pull && pm2 restart all"
# 以其他用户身份执行
ssh user@host "sudo -u www-data whoami"
进阶用法
# 开启压缩传输(慢网络时有用)
ssh -C user@host
# 静默模式(脚本中使用)
ssh -q user@host "command"
# 详细模式(调试连接问题)
ssh -v user@host # 一级详细
ssh -vv user@host # 二级详细
ssh -vvv user@host # 三级详细(最详细)
# 强制使用 IPv4
ssh -4 user@host
# 强制使用 IPv6
ssh -6 user@host
# 设置连接超时
ssh -o ConnectTimeout=10 user@host
# 禁用严格主机密钥检查(不推荐生产使用)
ssh -o StrictHostKeyChecking=no user@host
# 保持连接活跃(防止断开)
ssh -o ServerAliveInterval=60 user@host
SSH 配置文件
SSH 配置文件让你不用每次都输入复杂的参数:
# 编辑配置文件
vim ~/.ssh/config
配置文件示例:
# 全局配置
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
Compression yes
# 生产服务器
Host prod
HostName 192.168.1.100
User deploy
Port 22
IdentityFile ~/.ssh/prod_key
# 开发服务器
Host dev
HostName dev.mycompany.com
User developer
Port 2222
IdentityFile ~/.ssh/dev_key
ForwardAgent yes
# AWS EC2
Host aws-web
HostName ec2-xx-xx-xx-xx.compute-1.amazonaws.com
User ubuntu
IdentityFile ~/.ssh/aws.pem
# 跳板机配置
Host internal
HostName 10.0.0.100
User admin
ProxyJump bastion
Host bastion
HostName bastion.company.com
User admin
IdentityFile ~/.ssh/bastion_key
配置后可以这样连接:
ssh prod # 等于 ssh -i ~/.ssh/prod_key deploy@192.168.1.100
ssh dev # 等于 ssh -p 2222 -i ~/.ssh/dev_key developer@dev.mycompany.com
ssh aws-web # 等于 ssh -i ~/.ssh/aws.pem ubuntu@ec2-xx-xx-xx-xx...
SSH 密钥管理
# 生成密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
ssh-keygen -t ed25519 -C "your_email@example.com" # 更安全的算法
# 生成时指定文件名
ssh-keygen -t rsa -b 4096 -f ~/.ssh/myproject_key
# 查看公钥
cat ~/.ssh/id_rsa.pub
cat ~/.ssh/id_ed25519.pub
# 将公钥复制到服务器(自动配置)
ssh-copy-id user@host
ssh-copy-id -i ~/.ssh/mykey.pub user@host
# 手动复制公钥到服务器
cat ~/.ssh/id_rsa.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# 修改密钥密码
ssh-keygen -p -f ~/.ssh/id_rsa
# 查看密钥指纹
ssh-keygen -lf ~/.ssh/id_rsa.pub
SSH Agent(密钥代理)
SSH Agent 可以缓存你的私钥密码,避免每次都输入:
# 启动 ssh-agent
eval "$(ssh-agent -s)"
# 添加密钥到 agent
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/myproject_key
# 查看已添加的密钥
ssh-add -l
# 删除所有密钥
ssh-add -D
# 设置密钥有效期(秒)
ssh-add -t 3600 ~/.ssh/id_rsa # 1小时后自动删除
SSH 端口转发(隧道)
端口转发是 SSH 的强大功能,可以安全地访问内网资源:
# 本地端口转发:访问本地 8080 等于访问远程的 80
# 场景:通过跳板机访问内网 Web 服务
ssh -L 8080:internal-server:80 user@bastion
# 然后浏览器访问 http://localhost:8080
# 本地端口转发:访问远程数据库
ssh -L 3307:localhost:3306 user@db-server
# 然后用 mysql -h 127.0.0.1 -P 3307 连接
# 远程端口转发:让远程机器访问本地服务
# 场景:让服务器能访问你本地的服务
ssh -R 8080:localhost:3000 user@remote
# 远程机器访问 localhost:8080 等于访问你本地的 3000
# 动态端口转发(SOCKS 代理)
ssh -D 1080 user@remote
# 配置浏览器使用 SOCKS5 代理 127.0.0.1:1080
# 后台运行端口转发
ssh -fNL 8080:localhost:80 user@remote
# -f: 后台运行
# -N: 不执行远程命令
SSH 跳板机(ProxyJump)
当目标服务器在内网时,需要通过跳板机中转:
# 方式1:使用 -J 参数
ssh -J user@bastion user@internal-server
# 方式2:多级跳转
ssh -J user@bastion1,user@bastion2 user@target
# 方式3:配置文件方式(推荐)
# ~/.ssh/config
Host internal
HostName 10.0.0.100
User admin
ProxyJump bastion
常见问题解决
# 问题1:Permission denied (publickey)
# 原因:密钥不匹配或权限问题
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
# 问题2:Host key verification failed
# 原因:服务器密钥变更
ssh-keygen -R hostname # 删除旧的已知主机记录
# 问题3:Connection refused
# 原因:SSH 服务未运行或端口错误
# 检查服务器上的 SSH 服务
sudo systemctl status sshd
# 问题4:Connection timed out
# 原因:网络问题或防火墙
# 检查防火墙
sudo ufw status
sudo iptables -L
# 问题5:Too many authentication failures
# 原因:尝试了太多密钥
ssh -o IdentitiesOnly=yes -i specific_key user@host
1.2 openssh-server
是什么?
openssh-server 是 SSH 服务端程序,安装后你的机器就可以被其他人通过 SSH 连接。
安装与配置
# Ubuntu/Debian 安装
sudo apt update
sudo apt install openssh-server
# CentOS/RHEL 安装
sudo yum install openssh-server
# 启动服务
sudo systemctl start sshd
sudo systemctl enable sshd # 开机自启
# 查看状态
sudo systemctl status sshd
# 重启服务(修改配置后)
sudo systemctl restart sshd
配置文件详解
SSH 服务端配置文件位于 /etc/ssh/sshd_config:
# 编辑配置
sudo vim /etc/ssh/sshd_config
重要配置项:
# 监听端口(建议改为非标准端口)
Port 22
# Port 2222
# 监听地址
ListenAddress 0.0.0.0 # 所有 IPv4
ListenAddress :: # 所有 IPv6
# 协议版本(只用 2)
Protocol 2
# 允许 root 登录
PermitRootLogin yes # 允许
PermitRootLogin no # 禁止
PermitRootLogin prohibit-password # 禁止密码,允许密钥
# 密码认证
PasswordAuthentication yes # 允许密码登录
PasswordAuthentication no # 禁用密码,只允许密钥
# 公钥认证
PubkeyAuthentication yes
# 允许的用户(白名单)
AllowUsers user1 user2 deploy@192.168.1.*
# 禁止的用户(黑名单)
DenyUsers baduser
# 允许的用户组
AllowGroups sshusers admin
# 最大认证尝试次数
MaxAuthTries 3
# 最大会话数
MaxSessions 10
# 登录超时
LoginGraceTime 60
# 空闲超时
ClientAliveInterval 300 # 5分钟发一次心跳
ClientAliveCountMax 3 # 3次无响应断开
# X11 转发
X11Forwarding yes
# TCP 转发
AllowTcpForwarding yes
# 显示登录 Banner
Banner /etc/ssh/banner.txt
# 日志级别
LogLevel INFO # 可选:QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG
安全加固建议
# /etc/ssh/sshd_config 安全配置模板
# 1. 更改默认端口
Port 2222
# 2. 禁用 root 直接登录
PermitRootLogin prohibit-password
# 3. 禁用密码登录(只用密钥)
PasswordAuthentication no
# 4. 只允许特定用户
AllowUsers deploy admin
# 5. 限制登录尝试
MaxAuthTries 3
MaxSessions 5
LoginGraceTime 30
# 6. 使用强加密算法
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
# 7. 禁用不安全的功能
PermitEmptyPasswords no
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
# 8. 设置超时
ClientAliveInterval 300
ClientAliveCountMax 2
验证配置:
# 测试配置文件语法
sudo sshd -t
# 查看当前配置
sudo sshd -T
1.3 SCP (Secure Copy)
是什么?
SCP 是基于 SSH 的文件传输工具,用于在本地和远程服务器之间安全地复制文件。
基础用法
# 上传文件到远程
scp localfile.txt user@host:/remote/path/
scp localfile.txt user@host:~ # 上传到家目录
scp localfile.txt user@host:/tmp/newname.txt # 上传并重命名
# 下载文件到本地
scp user@host:/remote/file.txt ./
scp user@host:/remote/file.txt ./localname.txt
# 上传整个目录(递归)
scp -r ./local_dir user@host:/remote/path/
# 下载整个目录
scp -r user@host:/remote/dir ./local/
# 指定端口
scp -P 2222 file.txt user@host:/path/
# 指定密钥
scp -i ~/.ssh/mykey.pem file.txt user@host:/path/
# 保持文件属性(时间戳、权限等)
scp -p file.txt user@host:/path/
# 压缩传输
scp -C largefile.tar user@host:/path/
# 限制带宽(KB/s)
scp -l 1000 largefile.tar user@host:/path/ # 限制 1MB/s
# 静默模式
scp -q file.txt user@host:/path/
# 显示进度
scp -v file.txt user@host:/path/
在两台远程服务器间复制
# 从 server1 复制到 server2
scp user1@server1:/path/file user2@server2:/path/
# 注意:需要在 server1 上能 SSH 到 server2,或者使用 -3 参数通过本地中转
scp -3 user1@server1:/path/file user2@server2:/path/
常用组合
# 上传多个文件
scp file1.txt file2.txt file3.txt user@host:/path/
# 使用通配符
scp *.log user@host:/var/log/backup/
scp user@host:/var/log/*.log ./logs/
# 排除某些文件(需要用 rsync,scp 不支持)
1.4 SFTP (SSH File Transfer Protocol)
是什么?
SFTP 是基于 SSH 的交互式文件传输协议,提供了类似 FTP 的操作体验,但更安全。
基础用法
# 连接服务器
sftp user@host
sftp -P 2222 user@host # 指定端口
sftp -i key.pem user@host # 指定密钥
# 进入 SFTP 后的常用命令
sftp> help # 查看帮助
# 远程操作
sftp> ls # 列出远程文件
sftp> cd /var/www # 切换远程目录
sftp> pwd # 显示远程当前目录
sftp> mkdir newdir # 创建远程目录
sftp> rm file.txt # 删除远程文件
sftp> rmdir emptydir # 删除远程空目录
# 本地操作(命令前加 l)
sftp> lls # 列出本地文件
sftp> lcd /home/user # 切换本地目录
sftp> lpwd # 显示本地当前目录
# 文件传输
sftp> put localfile.txt # 上传文件
sftp> put -r localdir # 上传目录
sftp> get remotefile.txt # 下载文件
sftp> get -r remotedir # 下载目录
sftp> mput *.txt # 批量上传
sftp> mget *.log # 批量下载
# 退出
sftp> bye
sftp> exit
sftp> quit
批量操作
# 使用脚本批量操作
sftp user@host << EOF
cd /var/www
put index.html
put -r assets
bye
EOF
# 从文件读取命令
sftp -b commands.txt user@host
1.5 rsync
是什么?
rsync 是一个强大的文件同步工具,支持增量传输,比 scp 更高效。
为什么用 rsync 而不是 scp?
- 增量传输:只传输变化的部分,而不是整个文件
- 断点续传:传输中断后可以继续
- 压缩传输:可以压缩数据减少传输量
- 保持属性:完整保留文件权限、时间戳等
- 排除文件:可以指定不同步的文件
基础用法
# 基本语法
rsync [选项] 源 目标
# 本地同步
rsync -av /source/dir/ /dest/dir/
# 上传到远程(通过 SSH)
rsync -avz /local/dir/ user@host:/remote/dir/
# 下载到本地
rsync -avz user@host:/remote/dir/ /local/dir/
# 指定 SSH 端口
rsync -avz -e "ssh -p 2222" /local/ user@host:/remote/
# 指定 SSH 密钥
rsync -avz -e "ssh -i ~/.ssh/key.pem" /local/ user@host:/remote/
常用选项详解
-a, --archive # 归档模式,相当于 -rlptgoD
# r: 递归
# l: 复制符号链接
# p: 保持权限
# t: 保持时间戳
# g: 保持用户组
# o: 保持所有者
# D: 保持设备文件
-v, --verbose # 详细输出
-z, --compress # 压缩传输
-P # 显示进度 + 断点续传,等于 --partial --progress
--progress # 显示传输进度
--partial # 保留部分传输的文件,支持断点续传
-n, --dry-run # 模拟运行,不实际传输
--delete # 删除目标中源没有的文件(镜像同步)
--exclude # 排除文件
--include # 包含文件
--bwlimit # 限制带宽
-h, --human-readable # 人类可读的格式
实用示例
# 1. 完整备份(保留所有属性)
rsync -avzP /data/ user@backup:/backup/data/
# 2. 镜像同步(保持两端完全一致)
rsync -avz --delete /source/ /dest/
# 警告:--delete 会删除目标中多余的文件!
# 3. 排除文件
rsync -avz --exclude='*.log' --exclude='.git' /source/ /dest/
rsync -avz --exclude-from=exclude.txt /source/ /dest/
# exclude.txt 内容示例:
# *.log
# *.tmp
# .git/
# node_modules/
# __pycache__/
# 4. 只包含特定文件
rsync -avz --include='*.php' --exclude='*' /source/ /dest/
# 5. 限制带宽(KB/s)
rsync -avz --bwlimit=1000 /source/ user@host:/dest/
# 6. 显示传输详情
rsync -avzP --stats /source/ user@host:/dest/
# 7. 模拟运行(不实际执行)
rsync -avzn --delete /source/ /dest/
# 8. 备份时保留已删除文件
rsync -avz --backup --backup-dir=/backup/old /source/ /dest/
网站部署示例
# 部署前端项目
rsync -avz --delete \
--exclude='.git' \
--exclude='node_modules' \
--exclude='.env' \
./dist/ deploy@server:/var/www/html/
# 部署后端项目
rsync -avzP \
--exclude='*.pyc' \
--exclude='__pycache__' \
--exclude='.venv' \
--exclude='.env' \
./app/ deploy@server:/var/www/app/
rsync 与 scp 的对比
| 特性 | scp | rsync |
|---|---|---|
| 增量传输 | 否 | 是 |
| 断点续传 | 否 | 是 |
| 压缩传输 | 需要手动 | 内置 |
| 排除文件 | 不支持 | 支持 |
| 传输效率 | 较低 | 高 |
| 同步模式 | 仅复制 | 可镜像 |
二、文件与目录操作
2.1 ls - 列出目录内容
# 基本用法
ls # 列出当前目录
ls /var/log # 列出指定目录
ls file1 file2 # 列出指定文件
# 常用选项
ls -l # 详细信息(长格式)
ls -a # 显示隐藏文件(以 . 开头)
ls -la # 详细 + 隐藏
ls -lh # 人类可读的文件大小
ls -lt # 按时间排序(最新在前)
ls -ltr # 按时间逆序(最旧在前)
ls -lS # 按大小排序(最大在前)
ls -R # 递归显示子目录
ls -d */ # 只显示目录
ls -1 # 每行一个文件
ls -i # 显示 inode 号
ls --color=auto # 彩色显示
# 实用组合
ls -lah # 最常用:详细、隐藏、人类可读
ls -lahtr # 按时间倒序,最新的在最后
ls -l 输出解读
-rw-r--r-- 1 root root 4096 Jan 20 10:30 file.txt
│├──┬──┤ │ │ │ │ │ │
│ │ │ │ │ │ │ └─ 文件名
│ │ │ │ │ │ └─ 修改时间
│ │ │ │ │ └─ 文件大小
│ │ │ │ └─ 所属组
│ │ │ └─ 所有者
│ │ └─ 硬链接数
│ └─ 权限(所有者-组-其他)
└─ 类型(- 文件,d 目录,l 链接)
2.2 cd - 切换目录
cd /var/log # 切换到指定目录
cd # 回到家目录
cd ~ # 回到家目录
cd - # 回到上一个目录
cd .. # 上一级目录
cd ../.. # 上两级目录
cd ~user # 切换到某用户的家目录
2.3 pwd - 显示当前目录
pwd # 显示当前工作目录
pwd -P # 显示真实路径(解析符号链接)
2.4 mkdir - 创建目录
mkdir newdir # 创建目录
mkdir -p parent/child/grandchild # 递归创建(父目录不存在时自动创建)
mkdir -m 755 newdir # 创建并设置权限
mkdir dir1 dir2 dir3 # 同时创建多个目录
mkdir -p project/{src,test,docs} # 同时创建多个子目录
2.5 rmdir - 删除空目录
rmdir emptydir # 删除空目录
rmdir -p parent/child # 递归删除空目录
2.6 cp - 复制文件和目录
# 复制文件
cp source.txt dest.txt # 复制并重命名
cp source.txt /dest/path/ # 复制到目录
cp file1 file2 file3 /dest/ # 复制多个文件
# 复制目录
cp -r sourcedir destdir # 递归复制目录
cp -a sourcedir destdir # 保留所有属性(归档模式)
# 常用选项
cp -i source dest # 覆盖前提示
cp -n source dest # 不覆盖已存在的文件
cp -u source dest # 只在源文件更新时复制
cp -v source dest # 显示复制过程
cp -p source dest # 保留权限和时间戳
cp -l source dest # 创建硬链接而非复制
cp -s source dest # 创建符号链接而非复制
# 实用组合
cp -av /source/ /dest/ # 归档复制,显示过程
cp -rp /source/ /dest/ # 递归复制,保留属性
2.7 mv - 移动/重命名
# 重命名
mv oldname.txt newname.txt
# 移动
mv file.txt /dest/path/
mv file1 file2 file3 /dest/
mv dir1 /dest/
# 选项
mv -i source dest # 覆盖前提示
mv -n source dest # 不覆盖
mv -u source dest # 只在源更新时移动
mv -v source dest # 显示过程
# 批量重命名(需要 rename 命令)
rename 's/\.txt$/.md/' *.txt # 把 .txt 改为 .md
rename 's/^/prefix_/' * # 添加前缀
2.8 rm - 删除文件和目录
# 删除文件
rm file.txt
rm file1 file2 file3
rm *.log # 删除所有 .log 文件
# 删除目录
rm -r directory # 递归删除
rm -rf directory # 强制递归删除(危险!)
# 选项
rm -i file # 删除前提示
rm -f file # 强制删除,不提示
rm -v file # 显示删除过程
# 安全删除习惯
rm -i important.txt # 重要文件前加 -i
ls *.log && rm *.log # 先看看要删什么
警告:rm -rf / 或 rm -rf * 可能导致灾难性后果!
安全建议:
# 1. 使用 trash-cli 代替 rm
sudo apt install trash-cli
trash file.txt # 移到回收站
trash-list # 列出回收站
trash-restore # 恢复文件
trash-empty # 清空回收站
# 2. 设置别名
alias rm='rm -i' # 总是提示
2.9 touch - 创建空文件/更新时间戳
# 创建空文件
touch newfile.txt
touch file1 file2 file3 # 创建多个
# 更新时间戳
touch existingfile.txt # 更新访问和修改时间为当前
touch -a file.txt # 只更新访问时间
touch -m file.txt # 只更新修改时间
touch -t 202501201030 file # 设置特定时间(YYYYMMDDhhmm)
touch -r ref.txt file.txt # 使用参考文件的时间戳
2.10 find - 查找文件
find 是最强大的文件查找工具,一定要掌握!
# 基本语法
find [路径] [条件] [动作]
# 按名称查找
find /var -name "*.log" # 按名称(区分大小写)
find /var -iname "*.LOG" # 不区分大小写
find . -name "config*" # 以 config 开头
# 按类型查找
find . -type f # 文件
find . -type d # 目录
find . -type l # 符号链接
# 按大小查找
find . -size +100M # 大于 100MB
find . -size -1k # 小于 1KB
find . -size 50M # 正好 50MB
find . -empty # 空文件或空目录
# 按时间查找
find . -mtime -7 # 7天内修改过
find . -mtime +30 # 30天前修改过
find . -mmin -60 # 60分钟内修改过
find . -newer reference.txt # 比某文件新
# 按权限查找
find . -perm 755 # 权限为 755
find . -perm -755 # 至少包含 755 权限
find . -perm /u+x # 用户可执行
# 按所有者查找
find . -user root # 属于 root
find . -group www-data # 属于 www-data 组
find . -nouser # 无所有者的文件
# 组合条件
find . -name "*.txt" -size +1M # AND(默认)
find . -name "*.txt" -o -name "*.md" # OR
find . ! -name "*.txt" # NOT
# 限制深度
find . -maxdepth 2 -name "*.txt" # 最多向下2层
find . -mindepth 2 -name "*.txt" # 至少向下2层
# 执行动作
find . -name "*.tmp" -delete # 删除找到的文件
find . -name "*.sh" -exec chmod +x {} \; # 对每个文件执行命令
find . -name "*.log" -exec ls -lh {} \; # 显示详情
find . -name "*.txt" -exec grep "error" {} \; # 搜索内容
# 使用 xargs(更高效)
find . -name "*.txt" | xargs grep "error"
find . -name "*.tmp" | xargs rm
find . -type f -name "*.py" | xargs wc -l # 统计代码行数
实用示例
# 1. 查找并删除30天前的日志
find /var/log -name "*.log" -mtime +30 -delete
# 2. 查找大文件
find / -type f -size +500M 2>/dev/null
# 3. 查找空目录并删除
find . -type d -empty -delete
# 4. 查找最近修改的文件
find . -type f -mmin -30
# 5. 查找并压缩旧日志
find /var/log -name "*.log" -mtime +7 -exec gzip {} \;
# 6. 查找特定内容的文件
find . -type f -name "*.py" -exec grep -l "import pandas" {} \;
# 7. 统计目录下文件数量
find . -type f | wc -l
# 8. 查找重复文件(按大小)
find . -type f -exec md5sum {} \; | sort | uniq -d -w 32
# 9. 按扩展名统计文件数
find . -type f | sed 's/.*\.//' | sort | uniq -c | sort -rn
2.11 ln - 创建链接
# 创建硬链接
ln source.txt hardlink.txt
# 创建符号链接(软链接)
ln -s source.txt symlink.txt
ln -s /var/log/nginx logs # 创建目录链接
# 强制覆盖已存在的链接
ln -sf newsource.txt symlink.txt
# 查看链接指向
ls -la symlink.txt
readlink symlink.txt
readlink -f symlink.txt # 显示完整路径
硬链接 vs 软链接
| 特性 | 硬链接 | 软链接 |
|---|---|---|
| 跨文件系统 | 不可以 | 可以 |
| 链接目录 | 不可以 | 可以 |
| 原文件删除 | 仍可访问 | 链接失效 |
| inode | 相同 | 不同 |
| 文件大小 | 与原文件相同 | 只存储路径 |
2.12 tree - 树状显示目录结构
# 安装
sudo apt install tree # Debian/Ubuntu
sudo yum install tree # CentOS
# 基本用法
tree # 当前目录
tree /var/www # 指定目录
# 常用选项
tree -L 2 # 限制深度为2层
tree -d # 只显示目录
tree -a # 显示隐藏文件
tree -h # 显示文件大小
tree -p # 显示权限
tree -u # 显示所有者
tree -f # 显示完整路径
tree -I "node_modules|.git" # 排除目录
tree --dirsfirst # 目录排在前面
# 输出到文件
tree > structure.txt
tree -H . > tree.html # 输出 HTML
2.13 stat - 显示文件详细信息
stat file.txt
# 输出示例:
File: file.txt
Size: 1234 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 1234567 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
Access: 2025-01-20 10:30:00.000000000 +0800
Modify: 2025-01-19 15:20:00.000000000 +0800
Change: 2025-01-19 15:20:00.000000000 +0800
Birth: -
# 格式化输出
stat -c "%s" file.txt # 只显示大小
stat -c "%a" file.txt # 只显示权限(数字)
stat -c "%U:%G" file.txt # 所有者:组
2.14 file - 识别文件类型
file document.pdf # PDF document
file script.sh # Bourne-Again shell script
file image.png # PNG image data
file binary # ELF 64-bit LSB executable
file symlink # symbolic link to ...
file compressed.gz # gzip compressed data
三、文本处理工具
3.1 cat - 查看文件内容
# 查看文件
cat file.txt
cat file1.txt file2.txt # 合并显示多个文件
# 常用选项
cat -n file.txt # 显示行号
cat -b file.txt # 显示行号(空行不编号)
cat -s file.txt # 压缩连续空行
cat -A file.txt # 显示特殊字符
# 创建文件
cat > newfile.txt << EOF
line 1
line 2
EOF
# 追加内容
cat >> file.txt << EOF
appended line
EOF
# 合并文件
cat file1.txt file2.txt > combined.txt
3.2 less/more - 分页查看
# less(更强大,推荐使用)
less file.txt
# less 内部命令
# q - 退出
# 空格/f - 下一页
# b - 上一页
# g - 跳到开头
# G - 跳到结尾
# /pattern - 向下搜索
# ?pattern - 向上搜索
# n - 下一个搜索结果
# N - 上一个搜索结果
# 数字g - 跳到指定行
# less 选项
less -N file.txt # 显示行号
less -S file.txt # 不换行(长行用左右滚动)
less +F file.txt # 类似 tail -f,实时追踪
less +/pattern file.txt # 打开并搜索
# more(简单分页)
more file.txt
3.3 head/tail - 查看文件头部/尾部
# head - 查看开头
head file.txt # 默认前10行
head -n 20 file.txt # 前20行
head -n -5 file.txt # 除了最后5行
head -c 100 file.txt # 前100字节
# tail - 查看结尾
tail file.txt # 默认后10行
tail -n 20 file.txt # 后20行
tail -n +5 file.txt # 从第5行开始到结尾
tail -c 100 file.txt # 后100字节
# tail -f 实时追踪(看日志必备!)
tail -f /var/log/nginx/access.log
tail -f /var/log/syslog
# 追踪多个文件
tail -f file1.log file2.log
# 追踪并重试(文件可能被轮转)
tail -F /var/log/nginx/access.log
# 追踪最后100行
tail -n 100 -f app.log
# 组合使用
head -n 100 file.txt | tail -n 10 # 第91-100行
3.4 grep - 文本搜索神器
grep 是日志分析、代码搜索的必备工具!
# 基本用法
grep "pattern" file.txt
grep "error" /var/log/syslog
cat file.txt | grep "pattern"
# 常用选项
grep -i "pattern" file # 忽略大小写
grep -v "pattern" file # 反向匹配(不包含)
grep -n "pattern" file # 显示行号
grep -c "pattern" file # 只显示匹配行数
grep -l "pattern" *.txt # 只显示文件名
grep -L "pattern" *.txt # 显示不包含的文件
grep -w "word" file # 全词匹配
grep -x "exact line" file # 整行匹配
grep -r "pattern" /path/ # 递归搜索目录
grep -R "pattern" /path/ # 递归,包含符号链接
grep --include="*.py" -r "pattern" /path/ # 只搜索特定文件
grep -A 3 "pattern" file # 显示匹配行及后3行
grep -B 3 "pattern" file # 显示匹配行及前3行
grep -C 3 "pattern" file # 显示匹配行及前后3行
grep -E "pattern1|pattern2" file # 扩展正则(或)
grep -e "pattern1" -e "pattern2" file # 多个模式
grep -o "pattern" file # 只显示匹配部分
grep -q "pattern" file # 静默模式(用于脚本)
grep --color=auto "pattern" file # 高亮显示
正则表达式
# 基本正则
grep "^start" file # 以 start 开头
grep "end$" file # 以 end 结尾
grep "^$" file # 空行
grep "a.b" file # a 和 b 之间有任意字符
grep "a*" file # a 出现0次或多次
grep "a\+" file # a 出现1次或多次
grep "a\?" file # a 出现0次或1次
grep "[abc]" file # a、b 或 c
grep "[0-9]" file # 数字
grep "[a-zA-Z]" file # 字母
# 扩展正则(-E 或使用 egrep)
grep -E "a+" file # a 出现1次或多次
grep -E "a?" file # a 出现0次或1次
grep -E "a{3}" file # a 正好出现3次
grep -E "a{2,5}" file # a 出现2-5次
grep -E "(ab)+" file # ab 出现1次或多次
grep -E "cat|dog" file # cat 或 dog
实用示例
# 1. 搜索日志中的错误
grep -i "error\|fail\|exception" /var/log/app.log
# 2. 搜索并显示上下文
grep -C 5 "NullPointerException" app.log
# 3. 统计错误数量
grep -c "ERROR" app.log
# 4. 排除注释行
grep -v "^#" config.conf | grep -v "^$"
# 5. 搜索 IP 地址
grep -E "\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b" access.log
# 6. 搜索代码中的 TODO
grep -rn "TODO" --include="*.py" .
# 7. 查找包含特定函数的文件
grep -l "def main" *.py
# 8. 查找不包含某关键字的文件
grep -L "deprecated" *.py
# 9. 实时搜索日志
tail -f app.log | grep --line-buffered "ERROR"
# 10. 搜索二进制文件
grep -a "string" binary_file
3.5 sed - 流编辑器
sed 用于文本替换、删除、插入等操作,特别适合批量处理。
# 基本语法
sed [选项] '命令' 文件
# 替换(最常用)
sed 's/old/new/' file # 替换每行第一个匹配
sed 's/old/new/g' file # 替换所有匹配
sed 's/old/new/gi' file # 忽略大小写
sed 's/old/new/2' file # 替换第2个匹配
# 直接修改文件
sed -i 's/old/new/g' file # 直接修改文件
sed -i.bak 's/old/new/g' file # 修改并备份原文件
# 删除
sed '/pattern/d' file # 删除包含 pattern 的行
sed '3d' file # 删除第3行
sed '2,5d' file # 删除第2-5行
sed '1d;$d' file # 删除首尾行
sed '/^$/d' file # 删除空行
sed '/^#/d' file # 删除注释行
# 打印
sed -n '5p' file # 只打印第5行
sed -n '2,5p' file # 打印第2-5行
sed -n '/pattern/p' file # 打印匹配行
# 插入和追加
sed '3i\new line' file # 在第3行前插入
sed '3a\new line' file # 在第3行后追加
sed '/pattern/i\new line' file # 在匹配行前插入
# 替换整行
sed '3c\new content' file # 替换第3行
sed '/pattern/c\new line' file # 替换匹配行
# 多个命令
sed -e 's/a/A/g' -e 's/b/B/g' file
sed 's/a/A/g; s/b/B/g' file
分隔符
当要替换的内容包含 / 时,可以用其他分隔符:
sed 's|/usr/local|/opt|g' file
sed 's#http://#https://#g' file
sed 's@old@new@g' file
实用示例
# 1. 批量修改配置文件
sed -i 's/localhost/192.168.1.100/g' config.yaml
# 2. 删除空白行和注释
sed '/^$/d; /^#/d' config.conf
# 3. 在每行开头添加内容
sed 's/^/prefix: /' file
# 4. 在每行结尾添加内容
sed 's/$/ # comment/' file
# 5. 只处理特定行
sed '10,20s/old/new/g' file # 第10-20行
sed '/start/,/end/s/old/new/g' file # 从 start 到 end 之间
# 6. 提取特定字段
echo "name=value" | sed 's/.*=//' # 提取 value
# 7. 添加行号
sed = file | sed 'N; s/\n/\t/'
# 8. 批量重命名文件中的内容
find . -name "*.txt" -exec sed -i 's/foo/bar/g' {} \;
# 9. 去除 Windows 换行符
sed -i 's/\r$//' file
# 10. 提取两个标记之间的内容
sed -n '/START/,/END/p' file
3.6 awk - 文本处理语言
awk 是一个强大的文本处理工具,特别擅长处理列式数据。
# 基本语法
awk 'pattern { action }' file
# 打印特定列
awk '{print $1}' file # 第1列
awk '{print $1, $3}' file # 第1和第3列
awk '{print $NF}' file # 最后一列
awk '{print $(NF-1)}' file # 倒数第2列
# 指定分隔符
awk -F: '{print $1}' /etc/passwd # 冒号分隔
awk -F',' '{print $1}' file.csv # 逗号分隔
awk -F'\t' '{print $1}' file.tsv # Tab 分隔
# 条件过滤
awk '$3 > 100' file # 第3列大于100
awk '$1 == "error"' file # 第1列等于 error
awk 'NR > 1' file # 跳过首行
awk 'NR >= 10 && NR <= 20' file # 第10-20行
awk '/pattern/' file # 包含 pattern 的行
awk '!/pattern/' file # 不包含 pattern 的行
# 内置变量
# NR - 当前行号
# NF - 当前行的列数
# $0 - 整行内容
# $1, $2... - 第1、2...列
# FS - 输入字段分隔符
# OFS - 输出字段分隔符
# RS - 输入记录分隔符
# ORS - 输出记录分隔符
# 格式化输出
awk '{printf "%-10s %5d\n", $1, $2}' file
# BEGIN 和 END
awk 'BEGIN {print "Header"} {print} END {print "Footer"}' file
awk 'BEGIN {sum=0} {sum+=$1} END {print sum}' file # 求和
awk '{sum+=$1; count++} END {print sum/count}' file # 平均值
# 数组
awk '{count[$1]++} END {for(k in count) print k, count[k]}' file
实用示例
# 1. 分析 Apache 访问日志
# 统计每个 IP 的访问次数
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head
# 2. 统计每个 HTTP 状态码
awk '{print $9}' access.log | sort | uniq -c
# 3. 显示 /etc/passwd 的用户名和 shell
awk -F: '{print $1, $7}' /etc/passwd
# 4. 计算文件大小总和
ls -l | awk '{sum+=$5} END {print sum}'
# 5. 格式化输出(类似表格)
awk -F: 'BEGIN {printf "%-15s %-10s\n", "User", "Shell"}
{printf "%-15s %-10s\n", $1, $7}' /etc/passwd
# 6. 查找 UID 大于1000的用户
awk -F: '$3 >= 1000 {print $1}' /etc/passwd
# 7. 统计日志中的错误数
awk '/ERROR/ {count++} END {print count}' app.log
# 8. 提取时间范围内的日志
awk '$4 >= "[01/Jan/2025:10:00:00" && $4 <= "[01/Jan/2025:11:00:00"' access.log
# 9. 计算响应时间平均值
awk '{sum+=$NF; count++} END {print sum/count}' response_times.log
# 10. 分析内存使用(从 free 输出)
free -m | awk 'NR==2 {printf "Used: %.2f%%\n", $3/$2*100}'
3.7 cut - 提取列
# 按字符位置
cut -c1-5 file # 每行的第1-5个字符
cut -c1,3,5 file # 第1、3、5个字符
cut -c5- file # 从第5个字符到结尾
# 按字段(列)
cut -d: -f1 /etc/passwd # 按冒号分隔,取第1列
cut -d, -f1,3 file.csv # 按逗号分隔,取第1和第3列
cut -d' ' -f2- file # 从第2列到最后
# 常用选项
cut -d: -f1 --output-delimiter=' ' file # 指定输出分隔符
cut -d: -f1 --complement file # 取反(除了指定的列)
3.8 sort - 排序
# 基本排序
sort file # 字母顺序
sort -r file # 逆序
sort -n file # 数字顺序
sort -h file # 人类可读数字(1K, 2M)
sort -u file # 排序并去重
# 按指定列排序
sort -k2 file # 按第2列
sort -k2,2 file # 只按第2列
sort -k2n file # 第2列按数字排序
sort -t: -k3 -n /etc/passwd # 指定分隔符,按第3列数字排序
# 多列排序
sort -k1,1 -k2,2n file # 先按第1列字母,再按第2列数字
# 其他选项
sort -f file # 忽略大小写
sort -M file # 按月份排序(Jan, Feb...)
sort -V file # 版本号排序(1.2.3)
sort -R file # 随机排序
sort -c file # 检查是否已排序
sort -o output.txt file # 输出到文件(可与输入相同)
3.9 uniq - 去除重复行
# 注意:uniq 只能去除相邻的重复行,通常与 sort 配合使用
sort file | uniq
# 常用选项
sort file | uniq -c # 统计每行出现次数
sort file | uniq -d # 只显示重复的行
sort file | uniq -u # 只显示不重复的行
sort file | uniq -i # 忽略大小写
# 按字段去重
sort -k1,1 file | uniq -f1 # 忽略第1个字段
3.10 wc - 统计
wc file # 行数 词数 字节数
wc -l file # 行数
wc -w file # 词数
wc -c file # 字节数
wc -m file # 字符数
wc -L file # 最长行的长度
# 统计多个文件
wc -l *.txt
# 统计代码行数
find . -name "*.py" | xargs wc -l
find . -name "*.py" -exec wc -l {} + | tail -1
3.11 tr - 字符转换
# 大小写转换
echo "Hello" | tr 'a-z' 'A-Z' # 转大写
echo "HELLO" | tr 'A-Z' 'a-z' # 转小写
echo "Hello" | tr '[:lower:]' '[:upper:]'
# 删除字符
echo "hello 123" | tr -d '0-9' # 删除数字
echo "hello world" | tr -s ' ' # 压缩连续空格
# 替换字符
echo "hello" | tr 'e' 'a' # e 换成 a
cat file | tr '\n' ' ' # 换行换成空格
# 删除 Windows 换行符
cat file | tr -d '\r'
3.12 diff - 比较文件
# 基本用法
diff file1 file2
diff -u file1 file2 # 统一格式(最常用)
diff -c file1 file2 # 上下文格式
# 选项
diff -i file1 file2 # 忽略大小写
diff -w file1 file2 # 忽略空白字符
diff -B file1 file2 # 忽略空行
diff -r dir1 dir2 # 比较目录
# 并排显示
diff -y file1 file2
diff -y --suppress-common-lines file1 file2
# 简短输出
diff -q file1 file2 # 只显示是否不同
# 生成补丁
diff -u old.txt new.txt > patch.diff
# 应用补丁
patch < patch.diff
patch -R < patch.diff # 反向应用
四、包管理工具
4.1 apt/apt-get (Debian/Ubuntu)
是什么?
apt 是 Debian 系统(包括 Ubuntu)的包管理工具,用于安装、更新、删除软件。
# 更新包列表
sudo apt update
# 升级所有包
sudo apt upgrade
sudo apt full-upgrade # 完整升级(可能删除包)
# 安装软件
sudo apt install nginx
sudo apt install nginx=1.18.0-0ubuntu1 # 指定版本
sudo apt install ./package.deb # 安装本地 deb 文件
sudo apt install -y nginx # 自动确认
# 删除软件
sudo apt remove nginx # 删除软件,保留配置
sudo apt purge nginx # 完全删除,包括配置
sudo apt autoremove # 删除不需要的依赖
# 搜索软件
apt search nginx
apt-cache search nginx
# 查看软件信息
apt show nginx
apt-cache show nginx
# 列出已安装的包
apt list --installed
apt list --installed | grep nginx
# 列出可升级的包
apt list --upgradable
# 查看包的依赖
apt depends nginx
apt rdepends nginx # 反向依赖
# 锁定包版本(防止升级)
sudo apt-mark hold nginx
sudo apt-mark unhold nginx
apt-mark showhold
# 清理缓存
sudo apt clean # 清除下载的包文件
sudo apt autoclean # 只清除过期的包
软件源配置
# 查看源配置
cat /etc/apt/sources.list
ls /etc/apt/sources.list.d/
# 添加 PPA 源
sudo add-apt-repository ppa:ondrej/php
sudo apt update
# 添加第三方源
curl -fsSL https://example.com/key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg
echo "deb [signed-by=/etc/apt/keyrings/example.gpg] https://example.com/repo stable main" | sudo tee /etc/apt/sources.list.d/example.list
sudo apt update
4.2 yum/dnf (CentOS/RHEL/Fedora)
yum (CentOS 7 及更早)
# 更新包列表
sudo yum check-update
# 升级所有包
sudo yum update
# 安装软件
sudo yum install nginx
sudo yum install -y nginx # 自动确认
sudo yum localinstall package.rpm # 安装本地 rpm
# 删除软件
sudo yum remove nginx
# 搜索软件
yum search nginx
# 查看信息
yum info nginx
# 列出已安装
yum list installed
yum list installed | grep nginx
# 查看可用
yum list available
# 查看历史
yum history
yum history info 3 # 查看第3次事务详情
yum history undo 3 # 撤销第3次事务
# 清理缓存
sudo yum clean all
sudo yum makecache
# 查看仓库
yum repolist
yum repolist all # 包括禁用的
dnf (CentOS 8+, Fedora)
dnf 是 yum 的下一代版本,命令基本兼容:
# 基本用法与 yum 相同
sudo dnf update
sudo dnf install nginx
sudo dnf remove nginx
dnf search nginx
dnf info nginx
# dnf 特有功能
dnf module list # 查看模块
dnf module install nodejs:14
dnf module reset nodejs
仓库配置
# 仓库配置目录
ls /etc/yum.repos.d/
# 添加 EPEL 仓库(额外软件包)
sudo yum install epel-release
# 手动添加仓库
cat > /etc/yum.repos.d/custom.repo << EOF
[custom]
name=Custom Repository
baseurl=https://example.com/repo/
enabled=1
gpgcheck=1
gpgkey=https://example.com/RPM-GPG-KEY
EOF
# 禁用仓库
sudo yum-config-manager --disable custom
4.3 snap
是什么?
Snap 是 Canonical(Ubuntu 母公司)开发的通用包管理系统。Snap 包是自包含的,包含了应用运行所需的所有依赖,可以在任何支持 Snap 的 Linux 发行版上运行。
优缺点
优点:
- 跨发行版兼容
- 自动更新
- 沙箱隔离,更安全
- 版本回滚方便
缺点:
- 包体积较大
- 启动速度稍慢
- 占用更多磁盘空间
- 某些系统集成可能有问题
# 安装 snapd(Ubuntu 自带)
sudo apt install snapd
# 搜索应用
snap find nginx
snap find --name=nginx
# 安装应用
sudo snap install vlc
sudo snap install code --classic # 经典模式(更多系统权限)
# 查看已安装
snap list
# 查看应用信息
snap info vlc
# 更新应用
sudo snap refresh vlc
sudo snap refresh # 更新所有
# 删除应用
sudo snap remove vlc
# 回滚版本
sudo snap revert vlc
# 切换通道
sudo snap refresh vlc --channel=stable
sudo snap refresh vlc --channel=beta
# 查看变更历史
snap changes
snap change 3 # 查看第3次变更详情
# 管理服务
sudo snap services
sudo snap start <app>.<service>
sudo snap stop <app>.<service>
# 配置应用
snap get vlc
snap set vlc key=value
# 连接/断开接口
snap connections vlc
sudo snap connect vlc:removable-media
sudo snap disconnect vlc:removable-media
# 列出所有接口
snap interfaces
常用 Snap 应用
# 开发工具
sudo snap install code --classic # VS Code
sudo snap install sublime-text --classic
sudo snap install postman
# 容器工具
sudo snap install docker
sudo snap install lxd
# 多媒体
sudo snap install vlc
sudo snap install spotify
# 办公
sudo snap install libreoffice
# 通讯
sudo snap install slack
sudo snap install discord
4.4 flatpak
是什么?
Flatpak 是另一种通用包格式,与 Snap 类似但更注重桌面应用。
# 安装 flatpak
sudo apt install flatpak
# 添加 Flathub 仓库
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
# 搜索应用
flatpak search gimp
# 安装应用
flatpak install flathub org.gimp.GIMP
# 运行应用
flatpak run org.gimp.GIMP
# 更新应用
flatpak update
# 列出已安装
flatpak list
# 删除应用
flatpak uninstall org.gimp.GIMP
# 清理无用数据
flatpak uninstall --unused
4.5 brew (Homebrew)
是什么?
Homebrew 是 macOS 上最流行的包管理器,也可以在 Linux 上使用(Linuxbrew)。
# 安装 Homebrew (macOS)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 安装 Homebrew (Linux)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 更新 Homebrew
brew update
# 搜索软件
brew search nginx
# 安装软件
brew install nginx
brew install --cask google-chrome # 安装 GUI 应用(macOS)
# 升级软件
brew upgrade nginx
brew upgrade # 升级所有
# 删除软件
brew uninstall nginx
# 查看信息
brew info nginx
# 列出已安装
brew list
brew list --cask # 列出 GUI 应用
# 清理旧版本
brew cleanup
# 检查问题
brew doctor
# 服务管理
brew services list
brew services start nginx
brew services stop nginx
brew services restart nginx
4.6 rpm
rpm 是 Red Hat 系列系统的底层包管理工具:
# 安装
sudo rpm -ivh package.rpm # 安装
sudo rpm -Uvh package.rpm # 升级
sudo rpm -Fvh package.rpm # 只升级已安装的
# 删除
sudo rpm -e package
# 查询
rpm -qa # 列出所有已安装
rpm -qa | grep nginx
rpm -qi nginx # 查看包信息
rpm -ql nginx # 列出包的文件
rpm -qf /usr/bin/nginx # 查询文件属于哪个包
rpm -qp package.rpm # 查询未安装的包
# 验证
rpm -V nginx # 验证包完整性
# 提取文件
rpm2cpio package.rpm | cpio -idmv
4.7 dpkg
dpkg 是 Debian 系统的底层包管理工具:
# 安装
sudo dpkg -i package.deb
# 删除
sudo dpkg -r package # 删除软件
sudo dpkg -P package # 完全删除(含配置)
# 查询
dpkg -l # 列出所有包
dpkg -l | grep nginx
dpkg -s nginx # 查看包状态
dpkg -L nginx # 列出包的文件
dpkg -S /usr/bin/nginx # 查询文件属于哪个包
# 配置
sudo dpkg-reconfigure package # 重新配置包
# 修复依赖
sudo apt install -f
五、进程管理
5.1 ps - 查看进程
# 常用格式
ps aux # 显示所有进程
ps -ef # 另一种格式
ps -ejH # 树状显示
# 按用户查看
ps -u root # root 用户的进程
ps -U nginx # nginx 用户的进程
# 按进程名查看
ps -C nginx # 名为 nginx 的进程
# 自定义输出列
ps -eo pid,user,%cpu,%mem,cmd
ps -eo pid,ppid,user,args --forest # 树状 + 指定列
# 排序
ps aux --sort=-%cpu # 按 CPU 降序
ps aux --sort=-%mem # 按内存降序
ps aux --sort=-rss # 按实际内存降序
# 实用组合
ps aux | grep nginx # 查找 nginx 进程
ps aux | grep [n]ginx # 不显示 grep 自身
ps aux | head -1; ps aux | grep nginx # 带表头
ps 输出解读
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 169856 12160 ? Ss Jan20 0:03 /sbin/init
│ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ └─ 命令
│ │ │ │ │ │ │ │ │ └─ CPU 时间
│ │ │ │ │ │ │ │ └─ 启动时间
│ │ │ │ │ │ │ └─ 状态
│ │ │ │ │ │ └─ 终端
│ │ │ │ │ └─ 实际内存 (KB)
│ │ │ │ └─ 虚拟内存 (KB)
│ │ │ └─ 内存占比
│ │ └─ CPU 占比
│ └─ 进程 ID
└─ 用户
进程状态(STAT):
R- 运行中S- 可中断睡眠D- 不可中断睡眠(通常是 I/O)T- 已停止Z- 僵尸进程<- 高优先级N- 低优先级s- 会话首进程+- 前台进程
5.2 top - 动态进程监控
top
# 交互命令
# q - 退出
# h - 帮助
# 空格 - 立即刷新
# k - 杀死进程
# r - 调整优先级
# u - 按用户过滤
# M - 按内存排序
# P - 按 CPU 排序
# c - 显示完整命令
# 1 - 显示每个 CPU
# H - 显示线程
# 命令行选项
top -d 1 # 刷新间隔 1 秒
top -p 1234 # 只显示特定 PID
top -p 1234,5678 # 多个 PID
top -u nginx # 只显示特定用户
top -b # 批处理模式(脚本用)
top -b -n 1 # 批处理,只输出一次
5.3 htop - 增强版 top
# 安装
sudo apt install htop
sudo yum install htop
# 运行
htop
# 快捷键
# F1 - 帮助
# F2 - 设置
# F3 - 搜索
# F4 - 过滤
# F5 - 树状视图
# F6 - 排序
# F9 - 杀死进程
# F10 - 退出
# 命令行选项
htop -u root # 只显示 root 用户
htop -p 1234,5678 # 指定 PID
htop -d 10 # 刷新间隔 1 秒
htop -t # 树状视图
htop 比 top 更直观:
- 彩色显示
- 支持鼠标操作
- 进程树视图
- 横向滚动查看完整命令
- 更方便的进程操作
5.4 kill/pkill/killall - 终止进程
# kill - 按 PID 终止
kill 1234 # 发送 SIGTERM (15)
kill -9 1234 # 发送 SIGKILL (9),强制终止
kill -HUP 1234 # 发送 SIGHUP (1),重载配置
kill -l # 列出所有信号
# 常用信号
# SIGTERM (15) - 优雅终止,程序可以清理资源
# SIGKILL (9) - 强制终止,无法捕获
# SIGHUP (1) - 挂起,常用于重载配置
# SIGSTOP (19) - 暂停进程
# SIGCONT (18) - 继续运行
# pkill - 按名称终止
pkill nginx # 终止所有名为 nginx 的进程
pkill -9 nginx # 强制终止
pkill -u root # 终止 root 用户的所有进程
pkill -f "python app.py" # 按命令行匹配
# killall - 按名称终止(需要完整名称)
killall nginx
killall -9 nginx
killall -u root nginx # 特定用户的进程
killall -i nginx # 交互确认
# 批量终止
pkill -f "node.*server" # 正则匹配
kill $(pgrep nginx) # 使用 pgrep 获取 PID
5.5 pgrep - 查找进程 ID
pgrep nginx # 输出 nginx 的 PID
pgrep -l nginx # 输出 PID 和名称
pgrep -a nginx # 输出 PID 和完整命令
pgrep -u root # 特定用户的进程
pgrep -f "python app.py" # 按命令行匹配
pgrep -c nginx # 统计匹配的进程数
pgrep -P 1234 # 父进程为 1234 的进程
5.6 nohup - 后台运行(不挂断)
# nohup 让程序在终端关闭后继续运行
nohup ./script.sh &
nohup python app.py &
# 输出重定向
nohup ./script.sh > output.log 2>&1 &
nohup ./script.sh > /dev/null 2>&1 & # 忽略输出
# 查看 nohup.out
tail -f nohup.out
5.7 screen/tmux - 终端复用
screen
# 安装
sudo apt install screen
# 创建会话
screen # 创建匿名会话
screen -S myname # 创建命名会话
# 快捷键(Ctrl+A 后按)
# d - 分离会话
# c - 创建新窗口
# n - 下一个窗口
# p - 上一个窗口
# k - 关闭当前窗口
# " - 窗口列表
# 管理会话
screen -ls # 列出会话
screen -r # 重新连接
screen -r myname # 连接指定会话
screen -d -r myname # 强制接管会话
screen -X -S myname quit # 关闭会话
tmux
# 安装
sudo apt install tmux
# 创建会话
tmux # 创建匿名会话
tmux new -s myname # 创建命名会话
# 快捷键(Ctrl+B 后按)
# d - 分离会话
# c - 创建新窗口
# n - 下一个窗口
# p - 上一个窗口
# x - 关闭当前面板
# % - 左右分屏
# " - 上下分屏
# 方向键 - 切换面板
# 管理会话
tmux ls # 列出会话
tmux a # 连接最近会话
tmux a -t myname # 连接指定会话
tmux kill-session -t myname # 关闭会话
5.8 jobs/fg/bg - 作业控制
# 后台运行
./script.sh & # 直接后台运行
Ctrl+Z # 暂停当前程序
# 查看作业
jobs # 列出当前 shell 的作业
jobs -l # 显示 PID
# 前台/后台切换
fg # 将最近的作业调到前台
fg %1 # 将作业1调到前台
bg # 让最近暂停的作业在后台继续
bg %1 # 让作业1在后台继续
# 结合 disown
./script.sh &
disown # 与终端脱离关系
disown %1 # 指定作业
disown -h %1 # 保持作业但忽略 SIGHUP
六、用户与权限管理
6.1 sudo - 以管理员身份执行
# 基本用法
sudo command # 以 root 执行
sudo -u user command # 以其他用户执行
sudo -i # 切换到 root shell
sudo -s # 以 root 启动 shell
sudo su - # 切换到 root(另一种方式)
# 编辑 sudoers
sudo visudo # 安全编辑 sudoers 文件
# sudoers 配置示例
# /etc/sudoers 或 /etc/sudoers.d/username
# 格式:用户 主机=(可切换用户) 命令
root ALL=(ALL:ALL) ALL # root 可执行所有
%sudo ALL=(ALL:ALL) ALL # sudo 组可执行所有
deploy ALL=(ALL) NOPASSWD: ALL # deploy 无密码执行所有
deploy ALL=(ALL) NOPASSWD: /bin/systemctl # 只能无密码执行 systemctl
6.2 su - 切换用户
su # 切换到 root
su - # 切换到 root 并加载环境
su username # 切换到指定用户
su - username # 切换并加载环境
su -c "command" username # 以指定用户执行命令
6.3 chmod - 修改权限
# 数字模式(推荐)
chmod 755 file # rwxr-xr-x
chmod 644 file # rw-r--r--
chmod 600 file # rw-------
chmod 700 directory # rwx------
# 权限数字计算
# r = 4, w = 2, x = 1
# 755 = rwx(7) r-x(5) r-x(5)
# 644 = rw-(6) r--(4) r--(4)
# 符号模式
chmod u+x file # 用户添加执行权限
chmod g-w file # 组去掉写权限
chmod o=r file # 其他人只读
chmod a+x file # 所有人添加执行权限
chmod u=rwx,g=rx,o=rx file # 完整设置
# 递归修改
chmod -R 755 directory
# 常用场景
chmod 600 ~/.ssh/id_rsa # SSH 私钥
chmod 755 script.sh # 可执行脚本
chmod 644 config.yaml # 配置文件
6.4 chown - 修改所有者
# 修改所有者
chown user file
chown user:group file # 同时修改组
chown :group file # 只修改组
# 递归修改
chown -R user:group directory
# 常用场景
chown www-data:www-data /var/www
chown -R deploy:deploy /home/deploy/app
6.5 用户管理命令
# 查看用户信息
whoami # 当前用户名
id # 当前用户的 UID、GID
id username # 指定用户的信息
users # 当前登录的用户
who # 登录用户详情
w # 登录用户及其活动
last # 登录历史
lastlog # 所有用户最后登录
# 创建用户
sudo useradd username
sudo useradd -m username # 创建家目录
sudo useradd -m -s /bin/bash username # 指定 shell
sudo useradd -m -g group -G sudo username # 指定主组和附加组
# 修改用户
sudo usermod -aG sudo username # 添加到 sudo 组
sudo usermod -aG docker username # 添加到 docker 组
sudo usermod -s /bin/bash username # 修改 shell
sudo usermod -l newname oldname # 改名
sudo usermod -L username # 锁定用户
sudo usermod -U username # 解锁用户
# 删除用户
sudo userdel username
sudo userdel -r username # 同时删除家目录
# 修改密码
passwd # 修改自己的密码
sudo passwd username # 修改其他用户密码
sudo passwd -l username # 锁定密码
sudo passwd -u username # 解锁密码
sudo passwd -e username # 强制下次登录改密码
6.6 组管理命令
# 查看组
groups # 当前用户的组
groups username # 指定用户的组
cat /etc/group # 所有组
# 创建组
sudo groupadd mygroup
# 修改组
sudo groupmod -n newname oldname
# 删除组
sudo groupdel mygroup
# 添加用户到组
sudo gpasswd -a username groupname
sudo usermod -aG groupname username
# 从组移除用户
sudo gpasswd -d username groupname
七、网络工具
7.1 curl - HTTP 客户端
curl 是命令行 HTTP 客户端,用于测试 API、下载文件等。
# 基本请求
curl https://api.example.com
curl -v https://api.example.com # 详细输出
# 下载文件
curl -O https://example.com/file.tar.gz # 保留原文件名
curl -o myfile.tar.gz https://example.com/file.tar.gz # 指定文件名
curl -C - -O url # 断点续传
# 常用选项
curl -L url # 跟随重定向
curl -I url # 只获取响应头
curl -s url # 静默模式
curl -S url # 显示错误
curl -f url # 失败时不输出内容
# 设置超时
curl --connect-timeout 10 url # 连接超时
curl -m 30 url # 总超时
# 发送 POST 请求
curl -X POST url
curl -X POST -d "key=value" url
curl -X POST -d '{"name":"test"}' -H "Content-Type: application/json" url
# 发送表单
curl -X POST -F "file=@photo.jpg" url
curl -X POST -F "name=test" -F "file=@document.pdf" url
# 设置 Header
curl -H "Authorization: Bearer token123" url
curl -H "Content-Type: application/json" -H "Accept: application/json" url
# 基本认证
curl -u username:password url
curl -u username url # 提示输入密码
# 使用 Cookie
curl -b "session=abc123" url
curl -c cookies.txt url # 保存 cookie
curl -b cookies.txt url # 使用保存的 cookie
# HTTPS 相关
curl -k url # 忽略证书验证
curl --cacert ca.crt url # 指定 CA 证书
curl --cert client.crt --key client.key url # 客户端证书
# 代理
curl -x http://proxy:8080 url
curl -x socks5://proxy:1080 url
# 格式化 JSON 输出
curl -s url | jq .
# 测试接口响应时间
curl -w "@curl-format.txt" -o /dev/null -s url
# curl-format.txt 内容:
# time_namelookup: %{time_namelookup}\n
# time_connect: %{time_connect}\n
# time_appconnect: %{time_appconnect}\n
# time_pretransfer: %{time_pretransfer}\n
# time_redirect: %{time_redirect}\n
# time_starttransfer: %{time_starttransfer}\n
# ----------\n
# time_total: %{time_total}\n
API 测试示例
# GET 请求
curl -s https://api.github.com/users/octocat | jq .
# POST JSON
curl -X POST \
-H "Content-Type: application/json" \
-d '{"title":"Test","body":"Content"}' \
https://api.example.com/posts
# PUT 请求
curl -X PUT \
-H "Content-Type: application/json" \
-d '{"title":"Updated"}' \
https://api.example.com/posts/1
# DELETE 请求
curl -X DELETE https://api.example.com/posts/1
# 上传文件
curl -X POST \
-H "Authorization: Bearer token123" \
-F "file=@document.pdf" \
https://api.example.com/upload
7.2 wget - 下载工具
# 基本下载
wget https://example.com/file.tar.gz
# 常用选项
wget -O filename url # 指定文件名
wget -c url # 断点续传
wget -b url # 后台下载
wget -q url # 静默模式
# 下载限制
wget --limit-rate=1m url # 限速 1MB/s
wget -t 3 url # 重试次数
# 批量下载
wget -i urls.txt # 从文件读取 URL
wget -r -np url # 递归下载
wget -r -l 2 -np url # 递归深度 2
# 镜像网站
wget -m -k -p url # 镜像网站
# -m: 镜像模式
# -k: 转换链接
# -p: 下载所有资源
# 下载整个目录
wget -r -np -nH --cut-dirs=2 url/path/
# FTP 下载
wget ftp://user:pass@ftp.example.com/file
wget --ftp-user=user --ftp-password=pass ftp://...
# 使用代理
wget -e use_proxy=yes -e http_proxy=proxy:8080 url
7.3 ping - 测试网络连通性
ping google.com
ping -c 4 google.com # 只 ping 4 次
ping -i 2 google.com # 间隔 2 秒
ping -s 1000 google.com # 发送 1000 字节
ping -W 5 google.com # 超时 5 秒
ping -4 google.com # 强制 IPv4
ping -6 google.com # 强制 IPv6
7.4 traceroute/tracepath - 路由追踪
# traceroute
traceroute google.com
traceroute -n google.com # 不解析域名
traceroute -I google.com # 使用 ICMP
# tracepath(不需要 root)
tracepath google.com
7.5 netstat - 网络连接状态
# 查看监听端口
netstat -tlnp # TCP 监听
netstat -ulnp # UDP 监听
netstat -tunlp # 所有监听
# 选项说明
# -t: TCP
# -u: UDP
# -l: 监听状态
# -n: 数字显示(不解析域名)
# -p: 显示进程信息(需要 root)
# 查看所有连接
netstat -an
netstat -ant # TCP 连接
netstat -anp # 带进程信息
# 查看特定端口
netstat -anp | grep :80
netstat -anp | grep nginx
# 统计连接状态
netstat -ant | awk '{print $6}' | sort | uniq -c | sort -rn
# 查看路由表
netstat -r
netstat -rn
# 查看网络接口统计
netstat -i
7.6 ss - netstat 的替代品
ss 是 netstat 的现代替代品,速度更快。
# 查看监听端口
ss -tlnp # TCP 监听
ss -ulnp # UDP 监听
ss -tunlp # 所有监听
# 查看所有连接
ss -tan # TCP 连接
ss -tan | grep ESTAB # 已建立的连接
# 按状态过滤
ss -t state established
ss -t state time-wait
ss -t state close-wait
# 按端口过滤
ss -tlnp sport = :80
ss -tlnp dport = :443
# 统计
ss -s
# 显示更多信息
ss -tiepm # 显示计时器、扩展信息、进程、内存
7.7 dig/nslookup - DNS 查询
# dig(更强大)
dig google.com
dig google.com A # 查询 A 记录
dig google.com MX # 查询 MX 记录
dig google.com NS # 查询 NS 记录
dig google.com ANY # 所有记录
dig google.com +short # 简短输出
dig @8.8.8.8 google.com # 指定 DNS 服务器
dig -x 8.8.8.8 # 反向查询
dig google.com +trace # 追踪 DNS 解析过程
# nslookup(交互式)
nslookup google.com
nslookup google.com 8.8.8.8 # 指定 DNS
nslookup -type=mx google.com # 查询特定记录
7.8 host - 简单 DNS 查询
host google.com
host -t mx google.com
host -t ns google.com
host -a google.com # 所有记录
host 8.8.8.8 # 反向查询
八、磁盘与存储
8.1 df - 查看磁盘使用情况
df # 所有文件系统
df -h # 人类可读格式
df -H # 1000 为基数(而非 1024)
df -T # 显示文件系统类型
df -i # 显示 inode 使用情况
df /var # 特定目录
df -h --total # 显示总计
8.2 du - 查看目录大小
du /var/log # 目录大小
du -h /var/log # 人类可读
du -sh /var/log # 只显示总大小
du -sh * # 当前目录下各项大小
du -sh * | sort -h # 排序
du -sh * | sort -hr | head # 最大的几个
# 查找大目录
du -h --max-depth=1 / 2>/dev/null | sort -hr | head
# 排除某些目录
du -sh --exclude='*.log' /var
# ncdu - 更好用的 du
sudo apt install ncdu
ncdu /var
8.3 mount/umount - 挂载
# 查看已挂载
mount
mount | grep sda
# 挂载
sudo mount /dev/sdb1 /mnt/data
sudo mount -t ext4 /dev/sdb1 /mnt/data
sudo mount -o ro /dev/sdb1 /mnt/data # 只读
# 挂载 ISO
sudo mount -o loop image.iso /mnt/iso
# 挂载网络文件系统
sudo mount -t nfs server:/share /mnt/nfs
sudo mount -t cifs //server/share /mnt/smb -o username=user
# 卸载
sudo umount /mnt/data
sudo umount -l /mnt/data # 延迟卸载
sudo umount -f /mnt/data # 强制卸载
# 重新挂载(修改选项)
sudo mount -o remount,rw /
# 开机自动挂载
# 编辑 /etc/fstab
# 设备 挂载点 类型 选项 dump fsck
# /dev/sdb1 /mnt/data ext4 defaults 0 2
# UUID=xxx /mnt/data ext4 defaults,noatime 0 2
8.4 lsblk - 查看块设备
lsblk
lsblk -f # 显示文件系统
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,UUID
8.5 fdisk/parted - 磁盘分区
# 查看分区
sudo fdisk -l
sudo fdisk -l /dev/sda
# 分区操作(交互式)
sudo fdisk /dev/sdb
# m - 帮助
# n - 新建分区
# d - 删除分区
# p - 打印分区表
# w - 写入并退出
# q - 不保存退出
# parted(支持 GPT)
sudo parted /dev/sdb print
sudo parted /dev/sdb mklabel gpt
sudo parted /dev/sdb mkpart primary ext4 0% 100%
8.6 mkfs - 格式化
sudo mkfs.ext4 /dev/sdb1
sudo mkfs.xfs /dev/sdb1
sudo mkfs.ntfs /dev/sdb1
sudo mkfs.vfat /dev/sdb1 # FAT32
# 检查文件系统
sudo fsck /dev/sdb1
sudo fsck -y /dev/sdb1 # 自动修复
九、其他常用工具
9.1 date - 日期时间
date # 当前时间
date +%Y-%m-%d # 2025-01-20
date +%H:%M:%S # 10:30:00
date +%Y%m%d%H%M%S # 20250120103000
date -d "yesterday" # 昨天
date -d "1 week ago" # 一周前
date -d "next monday" # 下周一
date -u # UTC 时间
# 设置时间(需要 root)
sudo date -s "2025-01-20 10:30:00"
# 时区
timedatectl # 查看时区设置
timedatectl list-timezones # 列出时区
sudo timedatectl set-timezone Asia/Shanghai
9.2 cal - 日历
cal # 本月日历
cal 2025 # 2025年日历
cal 1 2025 # 2025年1月
cal -3 # 前后各一个月
9.3 history - 命令历史
history # 查看历史命令
history 20 # 最近 20 条
history | grep ssh # 搜索
!123 # 执行第 123 条命令
!! # 执行上一条命令
!ssh # 执行最近的 ssh 命令
Ctrl+R # 搜索历史
# 清除历史
history -c # 清除内存中的历史
history -w # 写入历史文件
9.4 alias - 命令别名
# 创建别名
alias ll='ls -la'
alias la='ls -A'
alias grep='grep --color=auto'
alias rm='rm -i'
# 查看别名
alias
alias ll
# 删除别名
unalias ll
# 永久别名(添加到 ~/.bashrc 或 ~/.zshrc)
echo "alias ll='ls -la'" >> ~/.bashrc
source ~/.bashrc
9.5 which/whereis/type - 查找命令位置
which python # 命令路径
which -a python # 所有路径
whereis python # 命令、源码、手册位置
type ls # 命令类型
type -a ls # 所有定义
command -v python # 类似 which,脚本中更可靠
9.6 man/help - 帮助文档
man ls # 查看手册
man -k keyword # 搜索手册
man 5 passwd # 查看第 5 节(配置文件)
# man 章节
# 1 - 用户命令
# 2 - 系统调用
# 3 - C 库函数
# 4 - 设备和特殊文件
# 5 - 配置文件格式
# 6 - 游戏
# 7 - 杂项
# 8 - 系统管理命令
# 内置命令帮助
help cd
help type
# 简短帮助
ls --help
9.7 echo/printf - 输出文本
echo "Hello World"
echo -n "No newline" # 不换行
echo -e "Tab:\t Newline:\n" # 解释转义字符
echo $PATH # 输出变量
printf "Name: %s, Age: %d\n" "Tom" 25
printf "%.2f\n" 3.14159
9.8 xargs - 构建命令参数
# 基本用法
find . -name "*.txt" | xargs cat
find . -name "*.log" | xargs rm
find . -name "*.py" | xargs grep "import"
# 处理特殊字符
find . -name "*.txt" -print0 | xargs -0 cat
# 限制参数数量
echo "a b c d e" | xargs -n 2 echo
# 指定占位符
find . -name "*.txt" | xargs -I {} cp {} /backup/
# 并行执行
find . -name "*.jpg" | xargs -P 4 -I {} convert {} -resize 50% small_{}
9.9 tee - 管道分流
# 输出到屏幕同时保存到文件
ls -la | tee output.txt
# 追加模式
ls -la | tee -a output.txt
# 多个文件
ls -la | tee file1.txt file2.txt
# 结合 sudo
echo "content" | sudo tee /etc/myconfig
9.10 watch - 定期执行命令
watch df -h # 每 2 秒执行一次
watch -n 1 df -h # 每 1 秒执行一次
watch -d df -h # 高亮变化部分
watch -n 5 "ps aux | grep nginx"
十、环境变量
10.1 查看和设置环境变量
# 查看
env # 所有环境变量
printenv # 同上
printenv PATH # 特定变量
echo $PATH
echo $HOME
echo $USER
# 临时设置(当前 shell)
export MY_VAR="value"
export PATH="$PATH:/new/path"
# 永久设置
# 用户级别:~/.bashrc 或 ~/.profile
# 系统级别:/etc/environment 或 /etc/profile.d/
# ~/.bashrc 示例
export JAVA_HOME=/usr/lib/jvm/java-11
export PATH=$PATH:$JAVA_HOME/bin
export EDITOR=vim
# 使配置生效
source ~/.bashrc
10.2 常用环境变量
$PATH # 命令搜索路径
$HOME # 用户家目录
$USER # 当前用户名
$SHELL # 当前 shell
$PWD # 当前目录
$OLDPWD # 上一个目录
$LANG # 语言设置
$EDITOR # 默认编辑器
$TERM # 终端类型
总结
以上是后端开发者每天都可能用到的 Linux 工具。建议:
- 多练习:每个命令都在自己机器上执行一遍
- 善用 man:遇到不熟悉的命令先看手册
- 记笔记:把常用的命令和参数组合记录下来
- 设置别名:把常用的复杂命令设为别名
下一章我们将介绍中频工具,包括服务管理、定时任务、日志管理等。