0


常用的4个Linux Shell脚本,实现运维自动化的基础

🐇明明跟你说过:个人主页

🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅

🔖行路有良友,便是天堂🔖

一、前言

1、Linux的起源与发展

1991年,芬兰赫尔辛基大学的学生林纳斯·托瓦兹(Linus Torvalds)开始编写一个新的操作系统内核,这个内核最初被称为“Freax”。他的初衷只是想学习操作系统内核的开发,并为自己的个人计算机编写一个操作系统。然而,当他将这个内核发布在Internet上并开放源代码后,全球各地的程序员开始参与到这个项目中来,共同完善这个内核。最终,这个内核被命名为Linux,这个名字是由Linus Torvalds的名字和Unix操作系统的名字组合而成的。

Linux从一开始就坚持源代码的公开和免费使用,任何人都可以对其进行修改和分发。这种开放性和自由性吸引了大量的开发者和用户,使得Linux逐渐成长并成熟起来。如今,Linux已经发展成为一个性能稳定、功能强大的多用户网络操作系统,支持32位和64位硬件,能运行主要的Unix工具软件、应用程序和网络协议。同时,Linux也有上百种不同的发行版,如基于社区开发的Debian、ArchLinux,以及基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等。

更多有关Linux的介绍,请参考《Linux是什么,该如何学习》

​​

2、什么是Shell脚本

Shell 脚本是一种用来编写一系列命令以自动执行特定任务的文本文件。它们由命令、控制结构、变量和函数组成,通常用于在 Unix 或类 Unix 操作系统(如 Linux)上执行系统管理任务、自动化任务或其他常见任务。Shell 脚本可以通过命令行解释器(如 Bash、sh、zsh 等)来执行,并且可以包含条件判断、循环、函数定义等高级功能。

Shell 脚本通常以 .sh 为扩展名,并且可以包含各种命令,包括系统命令、应用程序命令和其他脚本命令。通过组织和编写这些命令,可以创建一个可以自动执行特定任务的脚本。Shell 脚本在自动化系统管理、批处理任务、日常任务以及编写复杂的系统管理脚本方面非常有用。

​​

二、实际应用

1、系统管理与维护脚本

脚本要求:

  • 系统信息收集: 收集系统的基本信息,包括操作系统版本、内核版本、CPU信息、内存信息、磁盘使用情况等。
  • 日志清理: 定期清理系统日志文件,避免日志文件过大占用磁盘空间。
  • 定时任务检查: 检查系统中是否存在定时任务,记录定时任务的执行情况。
  • 服务状态检查: 检查系统中运行的服务状态,包括启动状态、运行状态等。
  • 安全性检查: 检查系统的安全性配置,包括防火墙设置、登录安全策略等。
  • 异常情况处理: 当发现异常情况时,及时记录并发送通知,方便管理员处理。

实现思路:

  • 系统信息收集: 使用系统命令(如uname、cat /proc/cpuinfo、free -m、df -h等)收集系统信息,将结果输出到日志文件。
  • 日志清理: 使用find命令定期清理日志文件,可以设置脚本定时执行。
  • 定时任务检查: 使用crontab -l命令获取系统中的定时任务信息,记录到日志文件中。
  • 服务状态检查: 使用systemctl status <service>命令检查各个服务的状态,记录到日志文件中。
  • 安全性检查: 使用iptables -L、sshd -T等命令检查防火墙设置和SSH安全策略,记录到日志文件中。
  • 异常情况处理: 使用if语句判断各项检查结果是否正常,如果异常则记录到日志文件中,并发送通知邮件给管理员。
#!/bin/bash

# 1. 系统信息收集
echo "System Information:" >> system_report.log
echo "OS Version: $(uname -a)" >> system_report.log
echo "Kernel Version: $(uname -r)" >> system_report.log
echo "CPU Info: $(cat /proc/cpuinfo)" >> system_report.log
echo "Memory Info: $(free -m)" >> system_report.log
echo "Disk Usage: $(df -h)" >> system_report.log

# 2. 日志清理(假设每周清理一次)
find /var/log -name "*.log" -mtime +7 -exec rm -rf {} \;

# 3. 定时任务检查
echo "Cron Jobs:" >> system_report.log
crontab -l >> system_report.log

# 4. 服务状态检查
echo "Service Status:" >> system_report.log
systemctl status apache >> system_report.log
systemctl status sshd >> system_report.log

# 5. 安全性检查
echo "Firewall Configuration:" >> system_report.log
iptables -L >> system_report.log
echo "SSH Configuration:" >> system_report.log
sshd -T >> system_report.log

# 6. 异常情况处理(示例:如果服务apache2状态异常,则发送邮件通知管理员)
if systemctl status apache2 | grep "Active: active (running)" >/dev/null; then
    echo "Apache2 is running normally."
else
    echo "Apache2 is not running. Sending notification to admin..."
    mail -s "Apache2 Service Alert" [email protected] <<< "Apache2 service is not running on $(hostname). Please check."
fi

# 结束
echo "System maintenance report generated."

2、文件操作脚本

脚本要求:

  1. 文件备份: 给定一个文件路径,将该文件备份到指定目录,并在备份文件名中添加当前日期时间。
  2. 文件压缩: 给定一个目录路径,将该目录下的所有文件压缩成一个压缩文件。
  3. **文件查找: **给定一个目录路径和关键字,查找该目录下包含关键字的所有文件。
  4. 文件比较: 给定两个文件路径,比较两个文件的内容是否相同。
  5. **文件权限设置: **给定一个文件路径和权限值,设置该文件的权限。
  6. **异常处理: **当发生异常情况时,及时记录并给出相应提示。

实现思路:

  • **文件备份: **使用cp命令复制文件到指定目录,并在文件名中添加当前日期时间。
  • **文件压缩: **使用tar命令将指定目录下的所有文件打包成一个压缩文件。
  • 文件查找: 使用find命令在指定目录下查找包含关键字的所有文件。
  • 文件比较: 使用diff命令比较两个文件的内容是否相同。
  • 文件权限设置: 使用chmod命令设置文件的权限。
  • 异常处理: 使用if语句判断各项操作是否成功,如果失败则输出错误提示信息。
#!/bin/bash

# 1. 文件备份
backup_file() {
    local file="$1"
    local backup_dir="$2"
    local backup_file="${backup_dir}/$(basename ${file}).$(date +%Y-%m-%d_%H-%M-%S)"
    cp "$file" "$backup_file"
    echo "File $file backed up to $backup_file"
}

# 2. 文件压缩
compress_directory() {
    local dir="$1"
    local output_file="$2"
    tar -czf "$output_file" "$dir"
    echo "Directory $dir compressed to $output_file"
}

# 3. 文件查找
find_files() {
    local directory="$1"
    local keyword="$2"
    echo "Files containing '$keyword' in directory $directory:"
    find "$directory" -type f -name "*$keyword*" -exec ls {} \;
}

# 4. 文件比较
compare_files() {
    local file1="$1"
    local file2="$2"
    if diff "$file1" "$file2" >/dev/null; then
        echo "Files $file1 and $file2 are identical."
    else
        echo "Files $file1 and $file2 are different."
    fi
}

# 5. 文件权限设置
set_file_permission() {
    local file="$1"
    local permission="$2"
    chmod "$permission" "$file"
    echo "Permission of file $file set to $permission"
}

# 6. 异常处理
handle_error() {
    local error_message="$1"
    echo "Error: $error_message"
}

# 主函数
main() {
    local action="$1"
    case $action in
        backup) backup_file "$2" "$3" ;;
        compress) compress_directory "$2" "$3" ;;
        find) find_files "$2" "$3" ;;
        compare) compare_files "$2" "$3" ;;
        set_permission) set_file_permission "$2" "$3" ;;
        *) handle_error "Invalid action: $action" ;;
    esac
}

# 调用主函数,并传入参数
main "$@"

3、网络管理脚本

脚本要求:

  1. 查看网络连接: 显示当前系统的网络连接状态,包括正在监听的端口和建立的连接。
  2. 检查网络连通性: 给定一个目标主机和端口,检查当前系统与目标主机的网络连通性。
  3. **查看网络流量: **显示当前系统的网络流量统计信息,包括接收和发送的数据量。
  4. **防火墙管理: **提供基本的防火墙管理功能,包括查看防火墙规则、添加规则、删除规则等。
  5. **异常处理: **当发生异常情况时,及时记录并给出相应提示。

实现思路:

  1. 查看网络连接: 使用netstat命令查看当前系统的网络连接状态。
  2. 检查网络连通性: 使用nc命令或ping命令检查系统与目标主机的网络连通性。
  3. 查看网络流量: 使用ifconfig命令或ip命令查看当前系统的网络接口信息,可以结合grep命令筛选需要的信息。
  4. 防火墙管理: 使用iptables命令管理防火墙规则。
  5. **异常处理: **使用if语句判断各项操作是否成功,如果失败则输出错误提示信息。
#!/bin/bash

# 1. 查看网络连接
view_network_connections() {
    echo "Network connections:"
    netstat -tuln
}

# 2. 检查网络连通性
check_network_connectivity() {
    local host="$1"
    local port="$2"
    echo "Checking connectivity to $host:$port ..."
    if nc -zv "$host" "$port" >/dev/null 2>&1; then
        echo "Connection to $host:$port successful."
    else
        echo "Connection to $host:$port failed."
    fi
}

# 3. 查看网络流量
view_network_traffic() {
    echo "Network traffic:"
    ifconfig
}

# 4. 防火墙管理
manage_firewall() {
    local action="$1"
    case $action in
        view_rules) iptables -L ;;
        add_rule) iptables -A INPUT -p tcp --dport "$2" -j ACCEPT ;;
        delete_rule) iptables -D INPUT -p tcp --dport "$2" -j ACCEPT ;;
        *) echo "Invalid action: $action" ;;
    esac
}

# 5. 异常处理
handle_error() {
    local error_message="$1"
    echo "Error: $error_message"
}

# 主函数
main() {
    local action="$1"
    case $action in
        view_connections) view_network_connections ;;
        check_connectivity) check_network_connectivity "$2" "$3" ;;
        view_traffic) view_network_traffic ;;
        manage_firewall) manage_firewall "$2" "$3" ;;
        *) handle_error "Invalid action: $action" ;;
    esac
}

# 调用主函数,并传入参数
main "$@"

启动脚本:

1. 查看网络连接:

   ./script_name.sh view_connections

2. 检查网络连通性 (例如,检查主机 192.168.1.1 的 80 端口):

   ./script_name.sh check_connectivity 192.168.1.1 80

3. 查看网络流量:

   ./script_name.sh view_traffic

4. 管理防火墙规则:
查看规则:

     ./script_name.sh manage_firewall view_rules

添加允许某个端口(如 22)的规则:

     ./script_name.sh manage_firewall add_rule 22

删除允许某个端口(如 22)的规则:

     ./script_name.sh manage_firewall delete_rule 22

如果不传入有效的参数,脚本会调用 handle_error 函数并显示错误信息。记得替换 script_name.sh 为你的脚本实际文件名。

4、定时任务脚本

脚本要求:

  1. **定时执行任务: **按照预定的时间间隔执行指定的任务。
  2. 任务执行日志: 记录每次任务执行的日志,包括执行时间和执行结果。
  3. 异常处理: 当任务执行出错时,及时记录并给出相应提示。

实现思路:

  1. 使用cron定时任务: 使用Linux系统自带的cron工具来执行定时任务,cron支持分钟、小时、日、月、星期等时间单位的定时调度。
  2. 编写任务脚本: 编写要执行的任务脚本,例如一个Shell脚本,确保脚本具有可执行权限。
  3. **任务执行日志: **在任务脚本中添加记录日志的功能,将执行时间和执行结果输出到指定的日志文件中。
  4. 异常处理: 在任务脚本中添加异常处理逻辑,例如使用if语句判断任务执行结果,如果出错则记录错误信息到日志中。

脚本示例:

#!/bin/bash

# 定义任务脚本路径
TASK_SCRIPT="/path/to/your/task_script.sh"

# 定义日志文件路径
LOG_FILE="/path/to/your/log_file.log"

# 执行任务,并记录执行时间和结果到日志文件
run_task() {
    echo "Task started at $(date)" >> "$LOG_FILE"
    if $TASK_SCRIPT >> "$LOG_FILE" 2>&1; then
        echo "Task completed successfully" >> "$LOG_FILE"
    else
        echo "Task failed" >> "$LOG_FILE"
    fi
    echo "Task ended at $(date)" >> "$LOG_FILE"
}

# 主函数
main() {
    run_task
}

# 调用主函数
main

使用cron配置定时任务:

  • 编辑cron任务列表:执行crontab -e命令打开cron任务列表文件。
  • 添加定时任务:在文件中添加一行配置,指定任务执行的时间间隔和要执行的脚本路径。例如,每小时执行一次任务可以添加如下配置:
0 * * * * /path/to/your/task_scheduler.sh

这个配置表示每小时的第0分钟执行一次task_scheduler.sh脚本,而task_scheduler.sh脚本会执行我们之前定义的任务脚本并记录执行日志。

脚本执行流程总结

  1. **初始化: **设置任务脚本路径和日志文件路径。
  2. **执行任务: **调用main函数,进而执行run_task函数。
  3. **日志记录: **记录任务从开始到结束的全部过程,包括时间戳和执行结果。
  4. **结束: **脚本执行完毕,日志中保留有完整的任务执行信息。

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Linux的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!

标签: 运维 centos linux

本文转载自: https://blog.csdn.net/weixin_53269650/article/details/138289184
版权归原作者 明明跟你说过 所有, 如有侵权,请联系我们删除。

“常用的4个Linux Shell脚本,实现运维自动化的基础”的评论:

还没有评论