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

明明跟你说过 2024-07-03 14:37:03 阅读 83

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

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

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

目录

一、前言

1、Linux的起源与发展

2、什么是Shell脚本

二、实际应用 

1、系统管理与维护脚本

2、文件操作脚本

3、网络管理脚本 

4、定时任务脚本 


一、前言

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语句判断各项检查结果是否正常,如果异常则记录到日志文件中,并发送通知邮件给管理员。

<code>#!/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" admin@example.com <<< "Apache2 service is not running on $(hostname). Please check."

fi

# 结束

echo "System maintenance report generated."

2、文件操作脚本

脚本要求:

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

实现思路:

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

<code>#!/bin/bash

# 1. 文件备份

backup_file() {

local file="$1"code>

local backup_dir="$2"code>

local backup_file="${backup_dir}/$(basename ${file}).$(date +%Y-%m-%d_%H-%M-%S)"code>

cp "$file" "$backup_file"

echo "File $file backed up to $backup_file"

}

# 2. 文件压缩

compress_directory() {

local dir="$1"code>

local output_file="$2"code>

tar -czf "$output_file" "$dir"

echo "Directory $dir compressed to $output_file"

}

# 3. 文件查找

find_files() {

local directory="$1"code>

local keyword="$2"code>

echo "Files containing '$keyword' in directory $directory:"

find "$directory" -type f -name "*$keyword*" -exec ls {} \;

}

# 4. 文件比较

compare_files() {

local file1="$1"code>

local file2="$2"code>

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"code>

local permission="$2"code>

chmod "$permission" "$file"

echo "Permission of file $file set to $permission"

}

# 6. 异常处理

handle_error() {

local error_message="$1"code>

echo "Error: $error_message"

}

# 主函数

main() {

local action="$1"code>

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、网络管理脚本 

脚本要求:

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

实现思路:

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

<code>#!/bin/bash

# 1. 查看网络连接

view_network_connections() {

echo "Network connections:"

netstat -tuln

}

# 2. 检查网络连通性

check_network_connectivity() {

local host="$1"code>

local port="$2"code>

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"code>

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"code>

echo "Error: $error_message"

}

# 主函数

main() {

local action="$1"code>

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、定时任务脚本 

脚本要求:

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

实现思路:

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

脚本示例:

<code>#!/bin/bash

# 定义任务脚本路径

TASK_SCRIPT="/path/to/your/task_script.sh"code>

# 定义日志文件路径

LOG_FILE="/path/to/your/log_file.log"code>

# 执行任务,并记录执行时间和结果到日志文件

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脚本会执行我们之前定义的任务脚本并记录执行日志。 

脚本执行流程总结

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

 

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

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。