Linux命令与自动化脚本精华

发布时间:2026/8/3 8:45:54
Linux命令与自动化脚本精华 Linux命令与自动化脚本核心指南一、核心Linux命令速查表类别命令功能描述常用示例文件与目录ls列出目录内容ls -la(详细列表)pwd显示当前工作目录pwdcd切换目录cd /home/usermkdir创建目录mkdir -p project/{src,bin}(创建多级目录)rm删除文件或目录rm -rf old_dir/(强制递归删除)cp复制cp -r source/ dest/(递归复制目录)mv移动/重命名mv old.txt new.txtfind查找文件find . -name *.log -mtime 7(查找7天前的日志)文件内容cat查看文件全部内容cat config.yamlhead/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 nginxtop/htop动态查看进程/资源topdf/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 userhostnamescp安全远程复制scp file.txt userremote:/path/wget/curl网络下载curl -O http://example.com/file进程管理kill终止进程kill -9 1234(强制终止PID 1234)nohup后台运行进程nohup ./server.sh 其他实用alias命令别名alias llls -lhistory查看命令历史history | grep sshman/--help查看命令手册/帮助man grep二、Shell脚本自动化编程核心1. 脚本基础结构所有Shell脚本应以#!/bin/bash(或#!/bin/sh) 开头指定解释器 。#!/bin/bash # 这是一个自动化备份脚本示例 # 作者: SysAdmin # 描述: 备份指定目录到远程服务器 # 1. 定义变量 BACKUP_SRC/home/user/data BACKUP_DESTuserbackup-server:/backups/ LOG_FILE/var/log/backup_$(date %Y%m%d).log MAX_DAYS30 # 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 02. 关键语法与技巧变量与参数处理#!/bin/bash # 变量定义与使用 SCRIPT_NAME$0 # 脚本名 FIRST_ARG$1 # 第一个参数 ALL_ARGS$ # 所有参数数组 ARG_COUNT$# # 参数个数 LAST_EXIT_CODE$? # 上条命令退出码 # 字符串操作 filenameapp_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 NR2 {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}% # 发送警报邮件等操作 fi3. 自动化任务示例示例1系统监控与告警脚本#!/bin/bash # monitor_system.sh 监控CPU、内存、磁盘并发送告警 THRESHOLD_CPU80 THRESHOLD_MEM85 THRESHOLD_DISK90ALERT_EMAILadminexample.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 NR2 {print $5} | sed s/%//) # 检查并告警 alerts if [[ $cpu_usage -gt $THRESHOLD_CPU ]]; then alertsCPU使用率过高: ${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_DAYS30BACKUP_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_USERdeploy SCRIPT_FILEdeploy_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 eof2. 使用cron定时任务将脚本设置为定时执行实现完全自动化。# 编辑当前用户的cron任务 crontab -e # 添加以下行 (每天凌晨2点执行备份脚本) 0 2 * * * /home/user/scripts/backup.sh /var/log/backup_cron.log 21 # 每5分钟检查一次系统状态 */5 * * * * /home/user/scripts/monitor_system.sh # 每周一早上6点清理日志 0 6 * * 1 /home/user/scripts/clean_logs.sh3. 错误处理与日志记录#!/bin/bash # 增强的错误处理脚本 set -euo pipefail # 严格模式错误退出、未定义变量报错、管道错误 LOG_FILE/var/log/auto_task_$(date %Y%m%d).log exec 1$LOG_FILE 21 # 重定向所有输出到日志 # 自定义错误处理函数 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都适用)

相关新闻