目录
- 文件和目录操作
- 文本处理和查找
- 系统监控和性能分析
- 网络管理和诊断
- 进程管理
- 权限和用户管理
- 磁盘和文件系统管理
- 服务管理
- 日志管理
- 压缩和归档
- 远程连接和文件传输
- 自动化和脚本
文件和目录操作
基础导航命令
ls
- 列出目录内容
bash
# 基本用法
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
- 切换目录
bash
cd /path/to/directory # 绝对路径
cd ../ # 返回上级目录
cd ~ # 回到家目录
cd - # 返回前一个目录
cd # 默认回到家目录
# DevOps常用路径
cd /var/log # 日志目录
cd /etc # 配置文件目录
cd /opt # 第三方软件安装目录
cd /usr/local/bin # 本地二进制文件
pwd
- 显示当前路径
bash
pwd # 显示完整路径
pwd -P # 显示物理路径(解析符号链接)
文件操作命令
cp
- 复制文件/目录
bash
# 基本复制
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
- 移动/重命名文件
bash
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
- 删除文件/目录
bash
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
- 创建目录
bash
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
- 创建文件或更新时间戳
bash
touch file # 创建空文件或更新时间戳
touch -t 202501011200 file # 设置特定时间戳
touch file{1..5} # 批量创建文件
# DevOps场景
touch /var/log/app.log # 创建日志文件
touch .maintenance # 创建维护标志文件
文本处理和查找
查看文件内容
cat
- 显示文件内容
bash
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
- 分页查看文件
bash
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
- 查看文件头尾
bash
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
- 文本搜索
bash
# 基本搜索
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
- 文本处理利器
bash
# 基本用法
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
- 流编辑器
bash
# 基本替换
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
- 文件查找
bash
# 基本查找
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
- 实时进程监控
bash
# 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
- 进程快照
bash
# 基本用法
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统计
bash
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监控
bash
iotop # 实时显示进程I/O使用情况
iotop -a # 显示累积I/O而不是带宽
iotop -o # 只显示有I/O活动的进程
iotop -p PID # 监控特定进程
vmstat
- 虚拟内存统计
bash
vmstat # 显示虚拟内存统计
vmstat 2 5 # 每2秒更新,显示5次
vmstat -s # 显示内存统计总结
# 重要指标
# r:运行队列中的进程数
# b:不可中断睡眠的进程数
# swpd:虚拟内存使用量
# free:空闲内存
# si/so:换入/换出内存页数
内存和磁盘监控
free
- 内存使用情况
bash
free # 显示内存使用情况
free -h # 人类可读格式
free -m # 以MB为单位显示
free -s 2 # 每2秒更新一次
# DevOps监控脚本
watch -n 2 free -h # 每2秒刷新内存使用情况
df
- 磁盘空间使用
bash
df # 显示文件系统磁盘使用情况
df -h # 人类可读格式
df -i # 显示inode使用情况
df -T # 显示文件系统类型
# DevOps实战
df -h | grep -vE '^Filesystem|tmpfs|cdrom' # 过滤掉临时文件系统
df -h /var/log # 检查日志目录磁盘使用
du
- 目录空间使用
bash
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
- 网络连接状态
bash
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的现代替代)
bash
ss -tulpn # 显示所有监听端口
ss -tln # 只显示TCP监听端口
ss -p # 显示进程信息
# DevOps应用
ss -tulpn | grep :22 # 查看SSH端口
ss -o state established # 显示已建立的连接
lsof
- 列出打开的文件
bash
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
- 网络连通性测试
bash
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
- 路由跟踪
bash
traceroute hostname # 跟踪到目标的网络路径
tracepath hostname # Linux自带的路由跟踪工具
mtr hostname # 结合ping和traceroute的工具
# DevOps应用
traceroute google.com # 诊断网络路由问题
mtr --report-cycles 10 google.com # 生成报告格式的路由分析
nmap
- 网络扫描
bash
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
- 网络包捕获
bash
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
- 终止进程
bash
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
- 按名称终止进程
bash
killall processname # 终止所有同名进程
killall -9 processname # 强制终止所有同名进程
killall -u username # 终止特定用户的所有进程
# DevOps应用
killall nginx # 终止所有nginx进程
killall -HUP rsyslog # 重载rsyslog服务
pkill
/ pgrep
- 按模式终止/查找进程
bash
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
- 不挂起运行
bash
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
- 终端复用
bash
# 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
- 作业控制
bash
jobs # 列出当前作业
bg %1 # 将作业1放到后台
fg %1 # 将作业1调到前台
command & # 直接后台运行命令
# Ctrl+Z:暂停前台进程
# Ctrl+C:终止前台进程
权限和用户管理
权限管理
chmod
- 修改文件权限
bash
# 数字模式
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
- 修改文件所有者
bash
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
- 修改文件组
bash
chgrp group file # 修改文件组
chgrp -R group directory # 递归修改组
umask
- 设置默认权限
bash
umask # 查看当前umask值
umask 022 # 设置umask值(新文件权限 = 666-umask)
umask 002 # 组内可写的umask设置
# 在.bashrc中设置默认umask
echo "umask 022" >> ~/.bashrc
用户管理
su
/ sudo
- 切换用户
bash
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
- 显示用户信息
bash
id # 显示当前用户信息
id username # 显示指定用户信息
whoami # 显示当前用户名
who # 显示当前登录用户
w # 显示详细的用户活动信息
# DevOps应用
id nginx # 查看nginx用户的UID和GID
w # 查看系统负载和用户活动
磁盘和文件系统管理
挂载和文件系统
mount
/ umount
- 挂载文件系统
bash
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
- 列出块设备
bash
lsblk # 树形显示块设备
lsblk -f # 显示文件系统信息
lsblk -S # 只显示SCSI设备
fdisk
- 磁盘分区管理
bash
fdisk -l # 列出所有磁盘分区
fdisk /dev/sdb # 对指定磁盘进行分区操作
# fdisk交互命令
# p:打印分区表
# n:创建新分区
# d:删除分区
# w:保存并退出
# q:不保存退出
文件系统检查和修复
fsck
- 文件系统检查
bash
fsck /dev/sdb1 # 检查文件系统
fsck -f /dev/sdb1 # 强制检查
fsck -y /dev/sdb1 # 自动回答yes
e2fsck /dev/sdb1 # 检查ext2/3/4文件系统
# 注意:检查前需要先卸载文件系统
服务管理
Systemd服务管理
systemctl
- 服务控制
bash
# 服务状态管理
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
- 服务控制(较老的系统)
bash
service nginx start # 启动nginx
service nginx stop # 停止nginx
service nginx restart # 重启nginx
service nginx status # 查看状态
# 查看所有服务状态
service --status-all
chkconfig
- 开机启动管理(CentOS/RHEL)
bash
chkconfig --list # 列出所有服务
chkconfig nginx on # 设置开机启动
chkconfig nginx off # 禁用开机启动
日志管理
系统日志
journalctl
- Systemd日志查看
bash
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
- 日志轮转
bash
# 配置文件:/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
和变种
bash
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
- 归档工具
bash
# 创建归档
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
- 压缩单个文件
bash
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格式
bash
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连接
bash
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
- 安全复制
bash
# 本地到远程
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
- 高效同步工具
bash
# 基本同步
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
bash
sftp user@hostname # 连接SFTP服务器
# SFTP内部命令:
# ls:列出远程目录
# lcd:切换本地目录
# cd:切换远程目录
# put:上传文件
# get:下载文件
# mput:批量上传
# mget:批量下载
自动化和脚本
定时任务
cron
- 定时任务调度
bash
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
- 环境变量管理
bash
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
bash -x script.sh # 显示脚本执行过程
bash -n script.sh # 检查语法不执行
bash -v script.sh # 显示读取的脚本行
# 在脚本中设置调试
#!/bin/bash
set -x # 开启调试模式
set -e # 遇到错误立即退出
set -u # 使用未定义变量时报错
set -o pipefail # 管道中任何命令失败都返回非零状态
高级技巧和实战场景
管道和重定向
bash
# 管道组合
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
实战脚本示例
系统监控脚本
bash
#!/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
自动部署脚本
bash
#!/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
日志分析脚本
bash
#!/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"
一键运维脚本
bash
#!/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工程师日常工作中最常用的命令和技巧。掌握这些命令可以大大提高工作效率,帮助你更好地管理服务器、监控系统状态、处理日志文件、自动化运维任务等。
学习建议:
- 循序渐进:从基础命令开始,逐步掌握高级功能
- 多练习:在安全的环境中反复练习这些命令
- 组合使用:学会将多个命令组合使用,发挥更大威力
- 编写脚本:将常用操作编写成脚本,提高自动化水平
- 持续学习:Linux命令体系庞大,需要持续学习和实践
最佳实践:
- 总是备份重要文件
- 使用适当的权限设置
- 编写可读性强的脚本
- 添加适当的日志记录
- 定期监控系统状态
- 自动化重复性任务