🐇明明跟你说过:个人主页
🏅个人专栏:《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语句判断各项检查结果是否正常,如果异常则记录到日志文件中,并发送通知邮件给管理员。
#!/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语句判断各项操作是否成功,如果失败则输出错误提示信息。
#!/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、网络管理脚本
脚本要求:
- 查看网络连接: 显示当前系统的网络连接状态,包括正在监听的端口和建立的连接。
- 检查网络连通性: 给定一个目标主机和端口,检查当前系统与目标主机的网络连通性。
- 查看网络流量: 显示当前系统的网络流量统计信息,包括接收和发送的数据量。
- 防火墙管理: 提供基本的防火墙管理功能,包括查看防火墙规则、添加规则、删除规则等。
- 异常处理: 当发生异常情况时,及时记录并给出相应提示。
实现思路:
- 查看网络连接: 使用netstat命令查看当前系统的网络连接状态。
- 检查网络连通性: 使用nc命令或ping命令检查系统与目标主机的网络连通性。
- 查看网络流量: 使用ifconfig命令或ip命令查看当前系统的网络接口信息,可以结合grep命令筛选需要的信息。
- 防火墙管理: 使用iptables命令管理防火墙规则。
- 异常处理: 使用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、定时任务脚本
脚本要求:
- 定时执行任务: 按照预定的时间间隔执行指定的任务。
- 任务执行日志: 记录每次任务执行的日志,包括执行时间和执行结果。
- 异常处理: 当任务执行出错时,及时记录并给出相应提示。
实现思路:
- 使用cron定时任务: 使用Linux系统自带的cron工具来执行定时任务,cron支持分钟、小时、日、月、星期等时间单位的定时调度。
- 编写任务脚本: 编写要执行的任务脚本,例如一个Shell脚本,确保脚本具有可执行权限。
- 任务执行日志: 在任务脚本中添加记录日志的功能,将执行时间和执行结果输出到指定的日志文件中。
- 异常处理: 在任务脚本中添加异常处理逻辑,例如使用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脚本会执行我们之前定义的任务脚本并记录执行日志。
脚本执行流程总结
- 初始化: 设置任务脚本路径和日志文件路径。
- 执行任务: 调用main函数,进而执行run_task函数。
- 日志记录: 记录任务从开始到结束的全部过程,包括时间戳和执行结果。
- 结束: 脚本执行完毕,日志中保留有完整的任务执行信息。
💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Linux的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺
🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!