云计算百科
云计算领域专业知识百科平台

Linux命令与自动化脚本精华

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) ==="

四、最佳实践建议

  • 脚本开头:总是包含 #!/bin/bash 和脚本描述注释。
  • 错误检查:检查命令返回值 ($?),对关键操作进行验证 。
  • 使用引号:变量引用总是使用双引号,如 "$variable",防止空格导致的错误。
  • 安全考虑:避免在脚本中硬编码密码,使用SSH密钥或环境变量。
  • 日志记录:所有自动化脚本都应记录详细日志,便于调试和审计。
  • 测试:先在测试环境运行,使用 set -x 调试模式查看执行过程。
  • 代码复用:将常用功能封装为函数,存放在单独的库文件中。
  • 版本控制:将脚本纳入Git等版本控制系统管理。
  • 通过结合这些命令和脚本技术,可以构建从简单文件操作到复杂系统管理的全自动工作流,显著提升Linux环境下的工作效率 。


    参考来源

    • Linux命令与Shell脚本(学习笔记)
    • 掌握常用的 Linux 命令和 Shell 脚本编程技术,可以极大地提高系统管理和自动化任务的效率
    • 从命令行到自动化:用Shell脚本和xrandr管理你的Linux多屏工作站
    • Windows Prompt命令行和Linux的Shell脚本自动化
    • 从命令行到自动化:用xrandr和shell脚本打造你的Linux多屏工作流(含常见错误排查)
    • 自动化脚本ssh以及telnet发送命令并退出(windows和linux都适用)

     

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Linux命令与自动化脚本精华
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!