Linux命令与自动化脚本核心指南
一、核心Linux命令速查表
| 文件与目录 | ls | 列出目录内容 | ls -la (详细列表) |
| pwd | 显示当前工作目录 | pwd | |
| cd | 切换目录 | cd /home/user | |
| mkdir | 创建目录 | mkdir -p project/{src,bin} (创建多级目录) | |
| rm | 删除文件或目录 | rm -rf old_dir/ (强制递归删除) | |
| cp | 复制 | cp -r source/ dest/ (递归复制目录) | |
| mv | 移动/重命名 | mv old.txt new.txt | |
| find | 查找文件 | find . -name "*.log" -mtime +7 (查找7天前的日志) | |
| 文件内容 | cat | 查看文件全部内容 | cat config.yaml |
| head / tail | 查看文件头/尾 | tail -f app.log (实时追踪日志) | |
| grep | 文本搜索 | grep -r "ERROR" /var/log/ (递归搜索) | |
| sed | 流编辑器 (非交互式编辑) | sed -i 's/foo/bar/g' file.txt (全局替换) | |
| awk | 文本分析处理 | awk '{print $1}' data.csv (打印第一列) | |
| 系统信息 | ps | 查看进程状态 | ps aux | grep nginx |
| top / htop | 动态查看进程/资源 | top | |
| df / du | 磁盘空间使用 | df -h (人类可读格式) | |
| free | 内存使用情况 | free -m (以MB显示) | |
| ifconfig / ip | 网络接口配置 | ifconfig eth0 | |
| 权限管理 | chmod | 修改文件权限 | chmod +x script.sh (添加执行权限) |
| chown | 修改文件所有者 | chown user:group file | |
| 压缩/打包 | tar | 打包与压缩 | tar -czvf archive.tar.gz dir/ (创建gzip压缩包) |
| gzip / gunzip | 压缩/解压 .gz 文件 | gzip file | |
| 网络操作 | ssh | 安全远程登录 | ssh user@hostname |
| scp | 安全远程复制 | scp file.txt user@remote:/path/ | |
| wget / curl | 网络下载 | curl -O http://example.com/file | |
| 进程管理 | kill | 终止进程 | kill -9 1234 (强制终止PID 1234) |
| nohup & & | 后台运行进程 | nohup ./server.sh & | |
| 其他实用 | alias | 命令别名 | alias ll='ls -l' |
| history | 查看命令历史 | history | grep ssh | |
| man / –help | 查看命令手册/帮助 | man grep |
二、Shell脚本自动化编程核心
1. 脚本基础结构
所有Shell脚本应以 #!/bin/bash (或 #!/bin/sh) 开头,指定解释器 。
#!/bin/bash
# 这是一个自动化备份脚本示例
# 作者: SysAdmin
# 描述: 备份指定目录到远程服务器
# 1. 定义变量
BACKUP_SRC="/home/user/data"
BACKUP_DEST="user@backup-server:/backups/"
LOG_FILE="/var/log/backup_$(date +%Y%m%d).log"
MAX_DAYS=30
# 2. 检查源目录是否存在
if [[ ! -d "$BACKUP_SRC" ]]; then echo "[ERROR] 源目录 $BACKUP_SRC 不存在!" | tee -a "$LOG_FILE"
exit 1
fi
# 3. 执行备份核心逻辑
echo "===开始备份 $(date) ===" >> "$LOG_FILE"
tar -czf – "$BACKUP_SRC" 2>> "$LOG_FILE" | \\
ssh "$BACKUP_DEST" "cat > backup_$(date +%Y%m%d_%H%M%S).tar.gz"
# 4. 检查命令执行状态
if [[ $? -eq 0 ]]; then
echo "[SUCCESS] 备份完成于 $(date)" >> "$LOG_FILE"
else echo "[FAILED] 备份失败,请检查日志!" >> "$LOG_FILE"
exit 1
fi
# 5. 清理旧日志 (超过30天)
find /var/log/ -name "backup_*.log" -mtime +$MAX_DAYS -delete
exit 0
2. 关键语法与技巧
变量与参数处理
#!/bin/bash
# 变量定义与使用
SCRIPT_NAME="$0" # 脚本名
FIRST_ARG="$1" # 第一个参数
ALL_ARGS="$@" # 所有参数数组
ARG_COUNT="$#" # 参数个数
LAST_EXIT_CODE="$?" # 上条命令退出码
# 字符串操作
filename="app_20250115.log"
echo "${filename%.*}" # 输出: app_20250115 (移除后缀)
echo "${filename##*.}" # 输出: log (获取后缀)
echo "${filename:4:8}" # 输出: 20250115 (子串)
# 数组操作
files=("file1.txt" "file2.txt" "file3.txt")
echo "文件数: ${#files[@]}" # 输出数组长度
echo "第一个文件: ${files[0]}" # 访问元素
条件判断与循环
#!/bin/bash
# 数值比较
if [[ $COUNT -gt 10 ]]; then echo "数量大于10"
elif [[ $COUNT -eq 0 ]]; then echo "数量为0"
else
echo "数量在1-10之间"
fi
# 文件/目录判断
if [[ -f "/etc/passwd" ]]; then
echo "是普通文件"
fi
if [[ -d "/var/log" ]]; then echo "是目录"
fi
# for循环处理文件
for file in *.txt; do if [[ -f "$file" ]]; then
echo "处理文件: $file"
# 在此添加处理逻辑,如 sed替换
sed -i 's/old/new/g' "$file"
fi
done
# while循环读取文件行
while IFS= read -r line; do echo "行内容: $line"
done < "input.txt"
函数定义与使用
#!/bin/bash
# 定义函数
log_message() {
local level="$1"
local msg="$2"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $msg" >> "/var/log/script.log"
}
# 带返回值的函数
check_disk_usage() {
local usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
echo $usage # 通过echo返回值,而非return (return只能0-255)
}
# 调用函数
log_message "INFO" "脚本开始执行"
current_usage=$(check_disk_usage)
if [[ $current_usage -gt 90 ]]; then log_message "ERROR" "磁盘使用率超过90%: ${current_usage}%"
# 发送警报邮件等操作
fi
3. 自动化任务示例
示例1:系统监控与告警脚本
#!/bin/bash
# monitor_system.sh 监控CPU、内存、磁盘并发送告警
THRESHOLD_CPU=80
THRESHOLD_MEM=85
THRESHOLD_DISK=90ALERT_EMAIL="admin@example.com"
# 获取系统指标
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
mem_usage=$(free | grep Mem | awk '{printf "%.0f", $3/$2 * 100}')
disk_usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
# 检查并告警
alerts=""
if [[ $cpu_usage -gt $THRESHOLD_CPU ]]; then alerts+="CPU使用率过高: ${cpu_usage}%
"
fi
if [[ $mem_usage -gt $THRESHOLD_MEM ]]; then alerts+="内存使用率过高: ${mem_usage}%
"
fi
if [[ $disk_usage -gt $THRESHOLD_DISK ]]; then alerts+="磁盘使用率过高: ${disk_usage}%
"
fi
# 如果有告警则发送
if [[ -n "$alerts" ]]; then echo -e "系统告警:
$alerts" | mail -s "系统监控告警 $(date)" "$ALERT_EMAIL"
echo "$(date): 发送告警" >> /var/log/monitor.log
fi
示例2:自动化日志清理
#!/bin/bash
# clean_logs.sh自动清理过期日志文件
LOG_DIRS=("/var/log" "/opt/app/logs")
RETENTION_DAYS=30BACKUP_DIR="/backup/logs/$(date +%Y%m)"
# 创建备份目录
mkdir -p "$BACKUP_DIR"
for dir in "${LOG_DIRS[@]}"; do if [[ -d "$dir" ]]; then
echo "处理目录: $dir"
# 压缩并备份7天前的日志 find "$dir" -name "*.log" -mtime +7 -exec tar -czf "$BACKUP_DIR/$(basename $dir)_$(date +%Y%m%d).tar.gz" {} +
# 删除30天前的日志
find "$dir" -name "*.log" -mtime +$RETENTION_DAYS -delete # 删除空日志文件
find "$dir" -name "*.log" -size 0 -delete
fi
doneecho "日志清理完成于 $(date)" >> /var/log/cleanup.log
示例3:多服务器批量操作
#!/bin/bash
# batch_deploy.sh批量部署到多台服务器
SERVERS=("server1.example.com" "server2.example.com" "192.168.1.100")
SSH_USER="deploy"
SCRIPT_FILE="deploy_app.sh"
REMOTE_DIR="/opt/app/"
for server in "${SERVERS[@]}"; do echo "正在部署到 $server …"
# 检查服务器连通性 if ! ping -c 1 -W 2 "$server" &> /dev/null; then
echo " [跳过] $server 无法连接"
continue
fi # 复制部署脚本
scp "$SCRIPT_FILE" "${SSH_USER}@${server}:${REMOTE_DIR}"
# 远程执行部署 ssh "${SSH_USER}@${server}" "cd ${REMOTE_DIR} && chmod +x ${SCRIPT_FILE} && ./${SCRIPT_FILE}"
if [[ $? -eq 0 ]]; then
echo " [成功] $server 部署完成"
else
echo " [失败] $server 部署出错"
fi
done
三、高级自动化技巧
1. 使用 expect 自动化交互
对于需要交互输入密码的命令,可使用 expect 自动化 。
#!/usr/bin/expect
# auto_ssh.exp自动SSH登录并执行命令
set timeout 30
set host "192.168.1.100"
set user "admin"
set password "your_password"
spawn ssh "$user@$host"
expect {
"*password:*" {
send "$password\\r"
exp_continue }
"*yes/no*" {
send "yes\\r"
exp_continue }
"$user@*" {
send "ls -la\\r"
send "df -h\\r"
send "exit\\r"
}
}
expect eof
2. 使用 cron 定时任务
将脚本设置为定时执行,实现完全自动化。
# 编辑当前用户的cron任务
crontab -e
# 添加以下行 (每天凌晨2点执行备份脚本)
0 2 * * * /home/user/scripts/backup.sh >> /var/log/backup_cron.log 2>&1
# 每5分钟检查一次系统状态
*/5 * * * * /home/user/scripts/monitor_system.sh
# 每周一早上6点清理日志
0 6 * * 1 /home/user/scripts/clean_logs.sh
3. 错误处理与日志记录
#!/bin/bash
# 增强的错误处理脚本
set -euo pipefail # 严格模式:错误退出、未定义变量报错、管道错误
LOG_FILE="/var/log/auto_task_$(date +%Y%m%d).log"
exec 1>>"$LOG_FILE" 2>&1 # 重定向所有输出到日志
# 自定义错误处理函数
error_exit() {
echo "[ERROR] $1 at line $2" >&2 # 可添加发送警报、清理临时文件等操作 exit 1
}
trap 'error_exit "$BASH_COMMAND" $LINENO' ERR # 捕获错误
# 主逻辑
echo "=== 任务开始: $(date) ==="
# 关键操作示例
if [[ ! -f "/etc/config.yaml" ]]; then
echo "配置文件不存在,使用默认配置"
cp "/etc/default_config.yaml" "/etc/config.yaml"
fi
# 使用临时文件安全处理数据
TEMP_FILE=$(mktemp)
process_data > "$TEMP_FILE"
mv "$TEMP_FILE" "/var/data/processed.txt"
echo "=== 任务完成: $(date) ==="
四、最佳实践建议
通过结合这些命令和脚本技术,可以构建从简单文件操作到复杂系统管理的全自动工作流,显著提升Linux环境下的工作效率 。
参考来源
- Linux命令与Shell脚本(学习笔记)
- 掌握常用的 Linux 命令和 Shell 脚本编程技术,可以极大地提高系统管理和自动化任务的效率
- 从命令行到自动化:用Shell脚本和xrandr管理你的Linux多屏工作站
- Windows Prompt命令行和Linux的Shell脚本自动化
- 从命令行到自动化:用xrandr和shell脚本打造你的Linux多屏工作流(含常见错误排查)
- 自动化脚本ssh以及telnet发送命令并退出(windows和linux都适用)
网硕互联帮助中心




评论前必须登录!
注册