DevOps工程师必备Linux命令完全指南

128 阅读9分钟

目录

  1. 文件和目录操作
  2. 文本处理和查找
  3. 系统监控和性能分析
  4. 网络管理和诊断
  5. 进程管理
  6. 权限和用户管理
  7. 磁盘和文件系统管理
  8. 服务管理
  9. 日志管理
  10. 压缩和归档
  11. 远程连接和文件传输
  12. 自动化和脚本

文件和目录操作

基础导航命令

ls - 列出目录内容

# 基本用法
ls                    # 列出当前目录文件
ls -l                 # 详细信息(权限、大小、时间)
ls -la                # 包含隐藏文件的详细信息
ls -lh                # 人类可读的文件大小
ls -ltr               # 按时间倒序排列
ls -lS                # 按文件大小排序

# 实用组合
ls -la /var/log/      # 查看日志目录详细信息
ls -lh --color=auto   # 彩色输出,便于识别文件类型

# DevOps场景应用
ls -la /etc/nginx/    # 检查nginx配置文件权限
ls -ltr /var/log/app/ | tail  # 查看最新的应用日志文件

cd - 切换目录

cd /path/to/directory  # 绝对路径
cd ../                 # 返回上级目录
cd ~                   # 回到家目录
cd -                   # 返回前一个目录
cd                     # 默认回到家目录

# DevOps常用路径
cd /var/log           # 日志目录
cd /etc               # 配置文件目录
cd /opt               # 第三方软件安装目录
cd /usr/local/bin     # 本地二进制文件

pwd - 显示当前路径

pwd                   # 显示完整路径
pwd -P                # 显示物理路径(解析符号链接)

文件操作命令

cp - 复制文件/目录

# 基本复制
cp file1 file2        # 复制文件
cp -r dir1 dir2       # 递归复制目录
cp -p file1 file2     # 保持原文件属性
cp -v file1 file2     # 显示复制过程

# DevOps场景
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak  # 备份配置文件
cp -r /var/www/html/ /backup/$(date +%Y%m%d)/       # 带时间戳的备份

mv - 移动/重命名文件

mv oldname newname    # 重命名文件
mv file /path/        # 移动文件到指定目录
mv -v file1 file2     # 显示移动过程

# DevOps场景
mv access.log access.log.$(date +%Y%m%d)  # 日志轮转
mv /tmp/deploy/* /var/www/html/            # 部署文件

rm - 删除文件/目录

rm file               # 删除文件
rm -r directory       # 递归删除目录
rm -f file            # 强制删除,不提示
rm -rf directory      # 强制递归删除(危险!)
rm -i file            # 交互式删除,确认提示

# 安全删除实践
rm -i *.log           # 交互式删除日志文件
find /tmp -name "*.tmp" -mtime +7 -exec rm {} \;  # 删除7天前的临时文件

mkdir - 创建目录

mkdir directory       # 创建单个目录
mkdir -p path/to/dir  # 创建多级目录
mkdir -m 755 dir      # 指定权限创建目录

# DevOps场景
mkdir -p /var/log/myapp/{error,access,debug}  # 创建应用日志目录结构
mkdir -p /backup/$(date +%Y/%m/%d)            # 创建按日期分层的备份目录

touch - 创建文件或更新时间戳

touch file            # 创建空文件或更新时间戳
touch -t 202501011200 file  # 设置特定时间戳
touch file{1..5}      # 批量创建文件

# DevOps场景
touch /var/log/app.log  # 创建日志文件
touch .maintenance      # 创建维护标志文件

文本处理和查找

查看文件内容

cat - 显示文件内容

cat file              # 显示整个文件
cat -n file           # 显示行号
cat -b file           # 只对非空行显示行号
cat file1 file2       # 合并显示多个文件

# DevOps场景
cat /etc/hosts        # 查看主机映射
cat /proc/cpuinfo     # 查看CPU信息
cat /etc/os-release   # 查看系统版本

less / more - 分页查看文件

less file             # 分页查看,支持前后翻页
more file             # 分页查看,只能向前翻页

# less 内部命令
# 空格键:下一页
# b:上一页
# g:跳到文件开头
# G:跳到文件末尾
# /pattern:搜索
# q:退出

# DevOps场景
less /var/log/syslog  # 查看系统日志
less +F /var/log/app.log  # 类似tail -f的实时查看

head / tail - 查看文件头尾

head file             # 显示前10行
head -n 20 file       # 显示前20行
tail file             # 显示后10行
tail -n 50 file       # 显示后50行
tail -f file          # 实时跟踪文件更新

# DevOps场景
tail -f /var/log/nginx/access.log              # 实时监控访问日志
tail -n 100 /var/log/app.log | grep ERROR      # 查看最近100行中的错误
head -n 1 /etc/passwd                          # 查看passwd文件格式

文本搜索和处理

grep - 文本搜索

# 基本搜索
grep "pattern" file           # 在文件中搜索模式
grep -i "pattern" file        # 忽略大小写
grep -v "pattern" file        # 反向匹配(不包含pattern的行)
grep -n "pattern" file        # 显示行号
grep -r "pattern" directory   # 递归搜索目录
grep -c "pattern" file        # 统计匹配行数

# 正则表达式
grep "^ERROR" file            # 匹配以ERROR开头的行
grep "ERROR$" file            # 匹配以ERROR结尾的行
grep -E "(ERROR|WARN)" file   # 匹配ERROR或WARN

# DevOps实战应用
grep -i error /var/log/syslog                    # 查找系统错误
grep -r "OutOfMemoryError" /var/log/             # 递归查找内存错误
grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"  # 查看配置文件(去除注释和空行)
ps aux | grep nginx                              # 查找nginx进程
netstat -tulpn | grep :80                        # 查看80端口使用情况

awk - 文本处理利器

# 基本用法
awk '{print $1}' file         # 打印第一列
awk '{print $1, $3}' file     # 打印第一和第三列
awk 'NR==5' file              # 打印第5行
awk '/pattern/ {print $0}' file  # 打印匹配行

# 条件处理
awk '$3 > 100' file           # 第三列大于100的行
awk 'length($0) > 80' file    # 行长度大于80的行

# DevOps实战
# 分析访问日志
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
# 统计最多访问的IP

# 分析进程内存使用
ps aux | awk '{sum+=$6} END {print "Total memory: " sum/1024 " MB"}'

# 从配置文件提取特定信息
awk -F: '$3 >= 1000 {print $1}' /etc/passwd  # 查找UID大于等于1000的用户

# 日志分析:统计HTTP状态码
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr

sed - 流编辑器

# 基本替换
sed 's/old/new/' file         # 替换每行第一个匹配
sed 's/old/new/g' file        # 替换所有匹配
sed 's/old/new/gi' file       # 忽略大小写替换

# 行操作
sed -n '5p' file              # 只打印第5行
sed '5d' file                 # 删除第5行
sed '1,5d' file               # 删除1-5行

# DevOps实战
# 配置文件修改
sed -i 's/localhost/0.0.0.0/g' /etc/nginx/nginx.conf  # 直接修改文件
sed -i '/^#/d' config.txt     # 删除注释行
sed -i '/^$/d' config.txt     # 删除空行

# 日志处理
sed 's/\[.*\]/[TIMESTAMP]/' access.log  # 替换时间戳
sed -n '/ERROR/,/^$/p' app.log           # 打印ERROR到空行之间的内容

find - 文件查找

# 基本查找
find /path -name "filename"           # 按文件名查找
find /path -name "*.log"              # 通配符查找
find /path -iname "*.LOG"             # 忽略大小写查找
find /path -type f                    # 只查找文件
find /path -type d                    # 只查找目录

# 按时间查找
find /path -mtime +7                  # 7天前修改的文件
find /path -mtime -1                  # 1天内修改的文件
find /path -atime +30                 # 30天未访问的文件

# 按大小查找
find /path -size +100M                # 大于100MB的文件
find /path -size -1k                  # 小于1KB的文件

# 执行操作
find /path -name "*.tmp" -delete      # 删除找到的文件
find /path -name "*.log" -exec ls -lh {} \;  # 对找到的文件执行命令

# DevOps实战场景
# 清理临时文件
find /tmp -type f -mtime +7 -delete

# 查找大文件
find /var -size +100M -type f -exec ls -lh {} \; | sort -k5 -hr

# 查找配置文件
find /etc -name "*.conf" -type f

# 查找最近修改的日志文件
find /var/log -name "*.log" -mtime -1

# 批量修改权限
find /var/www -type f -exec chmod 644 {} \;
find /var/www -type d -exec chmod 755 {} \;

# 查找空文件和目录
find /path -empty -type f             # 空文件
find /path -empty -type d             # 空目录

系统监控和性能分析

系统资源监控

top / htop - 实时进程监控

# top命令
top                   # 实时显示进程信息
top -p PID            # 监控特定进程
top -u username       # 监控特定用户的进程

# top内部快捷键
# P:按CPU使用率排序
# M:按内存使用率排序
# k:杀死进程
# q:退出

# htop(更友好的界面)
htop                  # 彩色界面的进程监控
htop -u username      # 监控特定用户

# DevOps应用
top -p $(pgrep nginx) # 监控nginx进程

ps - 进程快照

# 基本用法
ps                    # 显示当前用户进程
ps aux                # 显示所有进程详细信息
ps -ef                # 另一种显示所有进程的方式
ps -u username        # 显示特定用户进程

# 进程树
ps -ejH               # 显示进程树
pstree                # 更直观的进程树

# DevOps实战
ps aux | grep nginx                    # 查找nginx进程
ps aux | sort -nrk 3 | head           # CPU使用率最高的进程
ps aux | sort -nrk 4 | head           # 内存使用率最高的进程
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head  # 自定义显示格式

iostat - I/O统计

iostat                # 显示CPU和I/O统计
iostat -x 1 10        # 每秒更新,显示10次,扩展信息
iostat -d 2           # 每2秒显示磁盘统计

# 重要指标说明
# %iowait:等待I/O的CPU时间百分比
# r/s:每秒读操作数
# w/s:每秒写操作数
# util:设备利用率

# DevOps应用
iostat -x 1 | grep -E "(Device|sda)"  # 监控主磁盘I/O

iotop - 实时I/O监控

iotop                 # 实时显示进程I/O使用情况
iotop -a              # 显示累积I/O而不是带宽
iotop -o              # 只显示有I/O活动的进程
iotop -p PID          # 监控特定进程

vmstat - 虚拟内存统计

vmstat                # 显示虚拟内存统计
vmstat 2 5            # 每2秒更新,显示5次
vmstat -s             # 显示内存统计总结

# 重要指标
# r:运行队列中的进程数
# b:不可中断睡眠的进程数
# swpd:虚拟内存使用量
# free:空闲内存
# si/so:换入/换出内存页数

内存和磁盘监控

free - 内存使用情况

free                  # 显示内存使用情况
free -h               # 人类可读格式
free -m               # 以MB为单位显示
free -s 2             # 每2秒更新一次

# DevOps监控脚本
watch -n 2 free -h    # 每2秒刷新内存使用情况

df - 磁盘空间使用

df                    # 显示文件系统磁盘使用情况
df -h                 # 人类可读格式
df -i                 # 显示inode使用情况
df -T                 # 显示文件系统类型

# DevOps实战
df -h | grep -vE '^Filesystem|tmpfs|cdrom'  # 过滤掉临时文件系统
df -h /var/log        # 检查日志目录磁盘使用

du - 目录空间使用

du                    # 显示目录使用情况
du -h                 # 人类可读格式
du -s                 # 只显示总计
du -sh *              # 显示当前目录下各文件/目录大小

# DevOps实战
du -sh /var/log/* | sort -hr            # 查看最大的日志文件
du -h --max-depth=1 /var | sort -hr     # 查看/var下各目录大小
find /var/log -name "*.log" -exec du -sh {} \; | sort -hr  # 查找最大的日志文件

网络管理和诊断

网络状态查看

netstat - 网络连接状态

netstat -tulpn        # 显示所有监听端口
netstat -an           # 显示所有连接
netstat -rn           # 显示路由表
netstat -i            # 显示网络接口统计

# 参数说明
# -t:TCP连接
# -u:UDP连接
# -l:只显示监听端口
# -p:显示进程信息
# -n:以数字形式显示地址和端口

# DevOps实战
netstat -tulpn | grep :80             # 查看80端口使用情况
netstat -tulpn | grep nginx           # 查看nginx监听的端口
netstat -an | grep ESTABLISHED | wc -l  # 统计活跃连接数

ss - Socket统计(netstat的现代替代)

ss -tulpn             # 显示所有监听端口
ss -tln               # 只显示TCP监听端口
ss -p                 # 显示进程信息

# DevOps应用
ss -tulpn | grep :22             # 查看SSH端口
ss -o state established          # 显示已建立的连接

lsof - 列出打开的文件

lsof                  # 列出所有打开的文件
lsof -i               # 列出网络连接
lsof -i :80           # 查看80端口被哪个进程使用
lsof -u username      # 查看用户打开的文件
lsof -p PID           # 查看进程打开的文件

# DevOps实战
lsof -i :22                    # 查看SSH连接
lsof -i tcp:80                 # 查看80端口TCP连接
lsof +D /var/log               # 查看谁在使用日志目录
lsof | grep deleted            # 查找已删除但仍被进程占用的文件

网络诊断工具

ping - 网络连通性测试

ping hostname         # 基本ping测试
ping -c 5 hostname    # 发送5个包后停止
ping -i 2 hostname    # 每2秒发送一个包
ping -s 1024 hostname # 指定数据包大小

# DevOps应用
ping -c 3 8.8.8.8     # 测试外网连通性
ping -c 1 localhost   # 测试本地网络栈

traceroute / tracepath - 路由跟踪

traceroute hostname   # 跟踪到目标的网络路径
tracepath hostname    # Linux自带的路由跟踪工具
mtr hostname          # 结合ping和traceroute的工具

# DevOps应用
traceroute google.com # 诊断网络路由问题
mtr --report-cycles 10 google.com  # 生成报告格式的路由分析

nmap - 网络扫描

nmap hostname         # 扫描常用端口
nmap -p 1-65535 hostname  # 扫描所有端口
nmap -sS hostname     # TCP SYN扫描
nmap -sU hostname     # UDP扫描

# DevOps应用
nmap -p 22,80,443 server  # 扫描常用服务端口
nmap -sn 192.168.1.0/24   # 网段主机发现

tcpdump - 网络包捕获

tcpdump -i eth0       # 在eth0接口上捕获包
tcpdump -i any        # 在所有接口上捕获
tcpdump host hostname # 捕获与特定主机的通信
tcpdump port 80       # 捕获80端口的流量

# DevOps实战
tcpdump -i eth0 port 22 -w ssh.pcap     # 捕获SSH流量并保存
tcpdump -i any host 192.168.1.100       # 监控特定IP的流量
tcpdump -i eth0 -n port 80 | head -20   # 查看HTTP流量样本

进程管理

进程控制

kill - 终止进程

kill PID              # 发送TERM信号终止进程
kill -9 PID           # 发送KILL信号强制终止
kill -HUP PID         # 发送HUP信号(通常用于重载配置)
kill -USR1 PID        # 发送用户定义信号1

# 信号类型
# TERM (15):正常终止信号
# KILL (9):强制终止信号
# HUP (1):挂起信号,通常用于重载配置
# USR1 (10):用户定义信号1

# DevOps应用
kill -HUP $(cat /var/run/nginx.pid)     # 重载nginx配置
kill -USR1 $(cat /var/run/nginx.pid)    # nginx日志轮转

killall - 按名称终止进程

killall processname   # 终止所有同名进程
killall -9 processname # 强制终止所有同名进程
killall -u username   # 终止特定用户的所有进程

# DevOps应用
killall nginx         # 终止所有nginx进程
killall -HUP rsyslog  # 重载rsyslog服务

pkill / pgrep - 按模式终止/查找进程

pgrep nginx           # 查找nginx进程PID
pgrep -u username     # 查找特定用户的进程
pkill nginx           # 终止nginx进程
pkill -f "python app.py"  # 按完整命令行匹配终止进程

# DevOps应用
pgrep -f "java.*tomcat" | xargs kill -9  # 强制终止tomcat
pkill -u deploy       # 终止deploy用户的所有进程

后台进程管理

nohup - 不挂起运行

nohup command &       # 后台运行命令,不受终端关闭影响
nohup ./script.sh > output.log 2>&1 &  # 重定向输出到文件

# DevOps应用
nohup python app.py > /var/log/app.log 2>&1 &  # 后台运行应用
nohup ./backup.sh > backup.log 2>&1 &          # 后台运行备份脚本

screen / tmux - 终端复用

# screen
screen                # 创建新会话
screen -S sessionname # 创建命名会话
screen -ls            # 列出所有会话
screen -r sessionname # 恢复会话
# Ctrl+A, D:分离会话

# tmux
tmux                  # 创建新会话
tmux new-session -s name  # 创建命名会话
tmux list-sessions    # 列出会话
tmux attach-session -t name  # 恢复会话
# Ctrl+B, D:分离会话

# DevOps应用
screen -S deployment  # 创建部署会话
tmux new-session -s monitoring  # 创建监控会话

jobs / bg / fg - 作业控制

jobs                  # 列出当前作业
bg %1                 # 将作业1放到后台
fg %1                 # 将作业1调到前台
command &             # 直接后台运行命令

# Ctrl+Z:暂停前台进程
# Ctrl+C:终止前台进程

权限和用户管理

权限管理

chmod - 修改文件权限

# 数字模式
chmod 755 file        # rwxr-xr-x
chmod 644 file        # rw-r--r--
chmod 600 file        # rw-------

# 符号模式
chmod u+x file        # 给所有者添加执行权限
chmod g-w file        # 移除组的写权限
chmod o+r file        # 给其他用户添加读权限
chmod a+x file        # 给所有人添加执行权限

# 递归修改
chmod -R 755 directory

# DevOps应用
chmod +x deploy.sh                    # 给脚本添加执行权限
chmod 600 ~/.ssh/id_rsa               # 设置私钥权限
chmod -R 644 /var/www/html/*.html     # 设置网站文件权限
find /var/www -type d -exec chmod 755 {} \;  # 目录755权限
find /var/www -type f -exec chmod 644 {} \;  # 文件644权限

chown - 修改文件所有者

chown user file       # 修改文件所有者
chown user:group file # 修改所有者和组
chown :group file     # 只修改组
chown -R user:group directory  # 递归修改

# DevOps应用
chown -R nginx:nginx /var/www/html/       # 修改网站目录所有者
chown root:root /etc/sudoers              # 确保sudoers文件安全
chown mysql:mysql /var/lib/mysql/         # 修改数据库目录所有者

chgrp - 修改文件组

chgrp group file      # 修改文件组
chgrp -R group directory  # 递归修改组

umask - 设置默认权限

umask                 # 查看当前umask值
umask 022             # 设置umask值(新文件权限 = 666-umask)
umask 002             # 组内可写的umask设置

# 在.bashrc中设置默认umask
echo "umask 022" >> ~/.bashrc

用户管理

su / sudo - 切换用户

su username           # 切换到指定用户
su -                  # 切换到root用户并加载环境
sudo command          # 以root权限执行命令
sudo -u username command  # 以指定用户权限执行命令
sudo -l               # 查看当前用户sudo权限

# DevOps应用
sudo systemctl restart nginx      # 重启nginx服务
sudo -u postgres psql             # 以postgres用户连接数据库
sudo tail -f /var/log/syslog       # 查看系统日志

id - 显示用户信息

id                    # 显示当前用户信息
id username           # 显示指定用户信息
whoami                # 显示当前用户名
who                   # 显示当前登录用户
w                     # 显示详细的用户活动信息

# DevOps应用
id nginx              # 查看nginx用户的UID和GID
w                     # 查看系统负载和用户活动

磁盘和文件系统管理

挂载和文件系统

mount / umount - 挂载文件系统

mount                 # 显示已挂载的文件系统
mount /dev/sdb1 /mnt  # 挂载设备到目录
mount -t ext4 /dev/sdb1 /mnt  # 指定文件系统类型挂载
mount -o ro /dev/sdb1 /mnt    # 只读挂载

umount /mnt           # 卸载文件系统
umount -f /mnt        # 强制卸载

# DevOps应用
mount | grep -E '^/dev'                # 查看物理设备挂载
mount -o bind /var/log /backup/log     # 绑定挂载(备份场景)

lsblk - 列出块设备

lsblk                 # 树形显示块设备
lsblk -f              # 显示文件系统信息
lsblk -S              # 只显示SCSI设备

fdisk - 磁盘分区管理

fdisk -l              # 列出所有磁盘分区
fdisk /dev/sdb        # 对指定磁盘进行分区操作

# fdisk交互命令
# p:打印分区表
# n:创建新分区
# d:删除分区
# w:保存并退出
# q:不保存退出

文件系统检查和修复

fsck - 文件系统检查

fsck /dev/sdb1        # 检查文件系统
fsck -f /dev/sdb1     # 强制检查
fsck -y /dev/sdb1     # 自动回答yes
e2fsck /dev/sdb1      # 检查ext2/3/4文件系统

# 注意:检查前需要先卸载文件系统

服务管理

Systemd服务管理

systemctl - 服务控制

# 服务状态管理
systemctl start service    # 启动服务
systemctl stop service     # 停止服务
systemctl restart service  # 重启服务
systemctl reload service   # 重载配置
systemctl status service   # 查看服务状态

# 服务开机自启
systemctl enable service   # 设置开机自启
systemctl disable service  # 禁用开机自启
systemctl is-enabled service # 检查是否开机自启

# 服务信息
systemctl list-units       # 列出所有单元
systemctl list-units --type=service  # 只列出服务
systemctl list-unit-files  # 列出所有单元文件

# DevOps应用
systemctl status nginx              # 查看nginx状态
systemctl restart docker            # 重启docker服务
systemctl enable postgresql         # 设置数据库开机自启
systemctl --failed                  # 查看失败的服务

传统服务管理(SysV Init)

service - 服务控制(较老的系统)

service nginx start      # 启动nginx
service nginx stop       # 停止nginx
service nginx restart    # 重启nginx
service nginx status     # 查看状态

# 查看所有服务状态
service --status-all

chkconfig - 开机启动管理(CentOS/RHEL)

chkconfig --list         # 列出所有服务
chkconfig nginx on       # 设置开机启动
chkconfig nginx off      # 禁用开机启动

日志管理

系统日志

journalctl - Systemd日志查看

journalctl               # 查看所有日志
journalctl -f            # 实时跟踪日志
journalctl -u nginx      # 查看nginx服务日志
journalctl --since "2025-01-01"  # 查看指定日期后的日志
journalctl --until "2025-01-02"  # 查看指定日期前的日志
journalctl -p err        # 只显示错误级别日志

# 日志级别
# emerg (0):紧急
# alert (1):警告
# crit (2):严重
# err (3):错误
# warning (4):警告
# notice (5):注意
# info (6):信息
# debug (7):调试

# DevOps应用
journalctl -u docker -f                    # 实时查看docker日志
journalctl --since "1 hour ago"            # 查看1小时内的日志
journalctl -u nginx --since today          # 查看今天的nginx日志
journalctl -p err --since "2025-01-01"     # 查看错误日志

日志文件管理

logrotate - 日志轮转

# 配置文件:/etc/logrotate.conf 和 /etc/logrotate.d/

# 手动执行日志轮转
logrotate /etc/logrotate.conf
logrotate -f /etc/logrotate.d/nginx  # 强制轮转nginx日志

# 测试配置
logrotate -d /etc/logrotate.d/nginx  # 调试模式,不实际执行

实时日志监控

tail -f 和变种

tail -f /var/log/syslog              # 实时跟踪系统日志
tail -f /var/log/nginx/access.log    # 实时跟踪访问日志
tail -n 100 -f /var/log/app.log      # 先显示最后100行,然后跟踪

# 多文件同时监控
multitail /var/log/syslog /var/log/nginx/error.log

# 过滤和高亮
tail -f /var/log/app.log | grep --color=always ERROR

压缩和归档

归档和压缩

tar - 归档工具

# 创建归档
tar -cf archive.tar files/          # 创建tar归档
tar -czf archive.tar.gz files/      # 创建gzip压缩的tar归档
tar -cjf archive.tar.bz2 files/     # 创建bzip2压缩的tar归档

# 解压归档
tar -xf archive.tar                 # 解压tar归档
tar -xzf archive.tar.gz             # 解压gzip归档
tar -xjf archive.tar.bz2            # 解压bzip2归档

# 查看归档内容
tar -tf archive.tar                 # 列出归档内容
tar -tzf archive.tar.gz             # 列出gzip归档内容

# 排除文件
tar -czf backup.tar.gz --exclude='*.log' /var/www/

# DevOps应用
# 备份网站
tar -czf website_backup_$(date +%Y%m%d).tar.gz /var/www/html/

# 备份配置文件
tar -czf config_backup.tar.gz /etc/nginx/ /etc/apache2/

# 解压到指定目录
tar -xzf backup.tar.gz -C /restore/

# 备份除了日志外的所有文件
tar -czf app_backup.tar.gz --exclude='logs/*' --exclude='*.log' /opt/myapp/

gzip / gunzip - 压缩单个文件

gzip file.txt         # 压缩文件(原文件被替换)
gzip -k file.txt      # 保留原文件
gunzip file.txt.gz    # 解压文件
gzip -d file.txt.gz   # 解压文件(同gunzip)

# 查看压缩文件内容
zcat file.txt.gz      # 查看压缩文件内容
zless file.txt.gz     # 分页查看压缩文件
zgrep pattern file.txt.gz  # 在压缩文件中搜索

zip / unzip - ZIP格式

zip archive.zip files/       # 创建zip归档
zip -r archive.zip directory/  # 递归创建zip归档
unzip archive.zip            # 解压zip文件
unzip -l archive.zip         # 列出zip文件内容

# DevOps应用
zip -r deployment_$(date +%Y%m%d).zip /opt/app/  # 打包部署文件
unzip -q deployment.zip -d /deploy/              # 静默解压到指定目录

远程连接和文件传输

SSH连接

ssh - 安全Shell连接

ssh user@hostname           # 基本SSH连接
ssh -p 2222 user@hostname   # 指定端口连接
ssh -i keyfile user@hostname # 使用密钥文件连接
ssh -L 8080:localhost:80 user@hostname  # 本地端口转发
ssh -R 8080:localhost:80 user@hostname  # 远程端口转发

# SSH配置文件:~/.ssh/config
# Host server1
#     HostName 192.168.1.100
#     User admin
#     Port 2222
#     IdentityFile ~/.ssh/server1_key

# DevOps应用
ssh -t user@server "sudo tail -f /var/log/app.log"  # 执行远程命令
ssh -N -L 3306:localhost:3306 user@dbserver         # MySQL隧道

文件传输

scp - 安全复制

# 本地到远程
scp file.txt user@hostname:/path/
scp -r directory/ user@hostname:/path/

# 远程到本地
scp user@hostname:/path/file.txt ./
scp -r user@hostname:/path/directory/ ./

# 指定端口和密钥
scp -P 2222 -i keyfile file.txt user@hostname:/path/

# DevOps应用
scp deploy.tar.gz user@server:/opt/       # 传输部署包
scp -r /var/log/ backup@server:/backup/   # 备份日志到远程服务器

rsync - 高效同步工具

# 基本同步
rsync -av source/ destination/     # 归档模式同步
rsync -av --delete source/ dest/   # 同步并删除目标中多余文件
rsync -av --dry-run source/ dest/  # 预览同步操作

# 远程同步
rsync -av source/ user@hostname:/path/
rsync -av user@hostname:/path/ destination/

# 排除文件
rsync -av --exclude='*.log' source/ dest/
rsync -av --exclude-from=exclude.txt source/ dest/

# DevOps应用
# 网站同步
rsync -av --delete /var/www/html/ backup@server:/backup/www/

# 配置文件同步
rsync -av /etc/nginx/ config@server:/backup/nginx/

# 增量备份
rsync -av --link-dest=/backup/latest /data/ /backup/$(date +%Y%m%d)/

sftp - 安全FTP

sftp user@hostname      # 连接SFTP服务器
# SFTP内部命令:
# ls:列出远程目录
# lcd:切换本地目录
# cd:切换远程目录
# put:上传文件
# get:下载文件
# mput:批量上传
# mget:批量下载

自动化和脚本

定时任务

cron - 定时任务调度

crontab -l            # 查看当前用户的定时任务
crontab -e            # 编辑定时任务
crontab -r            # 删除所有定时任务
crontab -u user -l    # 查看指定用户的定时任务

# Cron时间格式:分 时 日 月 周
# * * * * * command
# 分钟 (0-59)
# 小时 (0-23)
# 日期 (1-31)
# 月份 (1-12)
# 星期 (0-7, 0和7都表示周日)

# DevOps实战示例
# 每天凌晨2点备份数据库
0 2 * * * /opt/scripts/backup_db.sh

# 每5分钟检查服务状态
*/5 * * * * /opt/scripts/check_services.sh

# 每周日凌晨3点清理日志
0 3 * * 0 /opt/scripts/cleanup_logs.sh

# 每月1号生成报告
0 0 1 * * /opt/scripts/monthly_report.sh

环境变量和配置

env / export - 环境变量管理

env                   # 显示所有环境变量
export VAR=value      # 设置环境变量
unset VAR             # 删除环境变量
echo $VAR             # 显示变量值

# 在脚本中设置环境变量
export PATH=$PATH:/opt/myapp/bin
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk

# DevOps应用
export DOCKER_HOST=tcp://docker-server:2376
export KUBECONFIG=/etc/kubernetes/admin.conf

脚本调试和执行

bash 调试选项

bash -x script.sh     # 显示脚本执行过程
bash -n script.sh     # 检查语法不执行
bash -v script.sh     # 显示读取的脚本行

# 在脚本中设置调试
#!/bin/bash
set -x                # 开启调试模式
set -e                # 遇到错误立即退出
set -u                # 使用未定义变量时报错
set -o pipefail       # 管道中任何命令失败都返回非零状态

高级技巧和实战场景

管道和重定向

# 管道组合
ps aux | grep nginx | grep -v grep | awk '{print $2}'  # 获取nginx进程PID
cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10  # 统计访问最多的IP

# 重定向
command > file        # 重定向输出到文件(覆盖)
command >> file       # 重定向输出到文件(追加)
command 2> file       # 重定向错误输出
command &> file       # 重定向所有输出
command < file        # 从文件读取输入

# 高级重定向
exec 3> logfile       # 创建文件描述符3
echo "log message" >&3  # 写入到文件描述符3
exec 3>&-             # 关闭文件描述符3

实战脚本示例

系统监控脚本

#!/bin/bash
# 系统资源监控脚本

LOG_FILE="/var/log/system_monitor.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

# CPU使用率
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)

# 内存使用率
MEM_USAGE=$(free | grep Mem | awk '{printf "%.2f", $3/$2 * 100.0}')

# 磁盘使用率
DISK_USAGE=$(df -h / | tail -1 | awk '{print $5}' | cut -d'%' -f1)

# 写入日志
echo "$DATE CPU:${CPU_USAGE}% MEM:${MEM_USAGE}% DISK:${DISK_USAGE}%" >> $LOG_FILE

# 告警条件
if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then
    echo "$DATE HIGH CPU USAGE: ${CPU_USAGE}%" | mail -s "CPU Alert" admin@example.com
fi

if (( $(echo "$MEM_USAGE > 80" | bc -l) )); then
    echo "$DATE HIGH MEMORY USAGE: ${MEM_USAGE}%" | mail -s "Memory Alert" admin@example.com
fi

自动部署脚本

#!/bin/bash
# 自动部署脚本

APP_NAME="myapp"
DEPLOY_DIR="/opt/$APP_NAME"
BACKUP_DIR="/backup/$APP_NAME"
SERVICE_NAME="$APP_NAME"

# 创建备份
echo "Creating backup..."
sudo cp -r $DEPLOY_DIR $BACKUP_DIR/$(date +%Y%m%d_%H%M%S)

# 停止服务
echo "Stopping service..."
sudo systemctl stop $SERVICE_NAME

# 部署新版本
echo "Deploying new version..."
sudo tar -xzf $APP_NAME.tar.gz -C $DEPLOY_DIR --strip-components=1

# 设置权限
sudo chown -R $APP_NAME:$APP_NAME $DEPLOY_DIR
sudo chmod +x $DEPLOY_DIR/bin/*

# 启动服务
echo "Starting service..."
sudo systemctl start $SERVICE_NAME

# 检查服务状态
if sudo systemctl is-active --quiet $SERVICE_NAME; then
    echo "Deployment successful!"
else
    echo "Deployment failed! Rolling back..."
    sudo systemctl stop $SERVICE_NAME
    sudo rm -rf $DEPLOY_DIR/*
    sudo cp -r $BACKUP_DIR/latest/* $DEPLOY_DIR/
    sudo systemctl start $SERVICE_NAME
    exit 1
fi

日志分析脚本

#!/bin/bash
# 日志分析脚本

LOG_FILE="/var/log/nginx/access.log"
REPORT_FILE="/tmp/log_analysis_$(date +%Y%m%d).txt"

echo "Nginx Log Analysis Report - $(date)" > $REPORT_FILE
echo "======================================" >> $REPORT_FILE

# 统计总请求数
TOTAL_REQUESTS=$(wc -l < $LOG_FILE)
echo "Total Requests: $TOTAL_REQUESTS" >> $REPORT_FILE

# 统计独立IP数
UNIQUE_IPS=$(awk '{print $1}' $LOG_FILE | sort | uniq | wc -l)
echo "Unique IPs: $UNIQUE_IPS" >> $REPORT_FILE

# 前10个访问最多的IP
echo -e "\nTop 10 IPs:" >> $REPORT_FILE
awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -nr | head -10 >> $REPORT_FILE

# 响应状态码统计
echo -e "\nStatus Codes:" >> $REPORT_FILE
awk '{print $9}' $LOG_FILE | sort | uniq -c | sort -nr >> $REPORT_FILE

# 最受欢迎的页面
echo -e "\nTop 10 Pages:" >> $REPORT_FILE
awk '{print $7}' $LOG_FILE | sort | uniq -c | sort -nr | head -10 >> $REPORT_FILE

echo "Report generated: $REPORT_FILE"

一键运维脚本

#!/bin/bash
# 一键运维工具

function show_menu() {
    echo "================================"
    echo "       运维工具菜单"
    echo "================================"
    echo "1. 系统状态检查"
    echo "2. 服务状态检查"
    echo "3. 日志查看"
    echo "4. 磁盘清理"
    echo "5. 网络诊断"
    echo "6. 退出"
    echo "================================"
}

function check_system() {
    echo "=== 系统状态 ==="
    echo "系统负载:"
    uptime
    echo -e "\n内存使用:"
    free -h
    echo -e "\n磁盘使用:"
    df -h
    echo -e "\nCPU信息:"
    top -bn1 | head -5
}

function check_services() {
    echo "=== 服务状态 ==="
    services=("nginx" "mysql" "redis" "docker")
    for service in "${services[@]}"; do
        if systemctl is-active --quiet $service; then
            echo "$service: ✅ 运行中"
        else
            echo "$service: ❌ 未运行"
        fi
    done
}

function view_logs() {
    echo "=== 最新错误日志 ==="
    journalctl -p err --since "1 hour ago" --no-pager | tail -20
}

function disk_cleanup() {
    echo "=== 磁盘清理 ==="
    echo "清理临时文件..."
    sudo find /tmp -type f -mtime +7 -delete
    echo "清理日志文件..."
    sudo find /var/log -name "*.log" -mtime +30 -delete
    echo "清理完成"
}

function network_check() {
    echo "=== 网络诊断 ==="
    echo "网络接口:"
    ip addr show | grep -E "inet.*scope global"
    echo -e "\n连通性测试:"
    ping -c 3 8.8.8.8
    echo -e "\n端口监听:"
    ss -tulpn | grep LISTEN | head -10
}

# 主循环
while true; do
    show_menu
    read -p "请选择操作 [1-6]: " choice
    
    case $choice in
        1) check_system ;;
        2) check_services ;;
        3) view_logs ;;
        4) disk_cleanup ;;
        5) network_check ;;
        6) echo "退出"; exit 0 ;;
        *) echo "无效选择,请重新输入" ;;
    esac
    
    echo -e "\n按回车键继续..."
    read
done

总结

这份Linux命令指南涵盖了DevOps工程师日常工作中最常用的命令和技巧。掌握这些命令可以大大提高工作效率,帮助你更好地管理服务器、监控系统状态、处理日志文件、自动化运维任务等。

学习建议:

  1. 循序渐进:从基础命令开始,逐步掌握高级功能
  2. 多练习:在安全的环境中反复练习这些命令
  3. 组合使用:学会将多个命令组合使用,发挥更大威力
  4. 编写脚本:将常用操作编写成脚本,提高自动化水平
  5. 持续学习:Linux命令体系庞大,需要持续学习和实践

最佳实践:

  • 总是备份重要文件
  • 使用适当的权限设置
  • 编写可读性强的脚本
  • 添加适当的日志记录
  • 定期监控系统状态
  • 自动化重复性任务