shell的经典案例

编写一个配置ip地址和修改主机名的脚本,并完成菜单里的功能,菜单如下:

1.配置主机名
2.配置ip
3.查看ip和主机名
4.退出
配置ip地址如果不成功,要求回滚到原来的ip地址,配置成功后,显示ip地址给用户看,要求尽可能的多些交互
ip地址输入后需要使用正则去判断是否合法,不合法的ip地址,要求重新输入。
配置主机名要求修改配置文件,永久有效,而且也要求临时有效。

#!/bin/bash  
  
# 配置主机名  
set_hostname() {  
    read -p "请输入主机名: " host_name  
    if hostnamectl set-hostname "${host_name}"; then  
        echo "主机名已更改为 ${host_name}"  
    else  
        echo "更改主机名失败"  
    fi  
}  
  
# 配置IP地址  
set_ip() {  
    local original_ip=$(grep '^IPADDR=' /etc/sysconfig/network-scripts/ifcfg-ens33 | cut -d'=' -f2)  
    local myip  
    until [[ $(echo "$myip" | grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$') ]]; do  
        read -p "请输入一个合法的IP地址(例如:192.168.1.1): " myip  
        if ! [[ $(echo "$myip" | grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$') ]]; then  
            echo "输入的IP地址不合法,请重新输入。"  
        fi  
    done  
  
    sed -i "/^IPADDR=/c\IPADDR=$myip" /etc/sysconfig/network-scripts/ifcfg-ens33  
    if systemctl restart network; then  
        echo "IP地址已更改为 $myip"  
    else  
        sed -i "/^IPADDR=/c\IPADDR=$original_ip" /etc/sysconfig/network-scripts/ifcfg-ens33  
        systemctl restart network  
        echo "配置IP地址失败,已回滚到原始IP地址 $original_ip"  
    fi  
}  
  
# 查看IP和主机名  
get_ip_hostname() {  
    echo "主机名是 $(hostname)"  
    local get_ip=$(ip addr show ens33 | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1)  
    echo "IP地址是 $get_ip"  
}  
  
# 菜单函数  
menu() {  
    echo "1. 配置主机名"  
    echo "2. 配置IP"  
    echo "3. 查看IP和主机名"  
    echo "4. 退出"  
    read -p "请输入你的选择: " option  
}  
  
# 主逻辑  
while true; do  
    menu  
    case $option in  
        1)  
            set_hostname  
            ;;  
        2)  
            set_ip  
            ;;  
        3)  
            get_ip_hostname  
            ;;  
        4)  
            exit  
            ;;  
        *)  
            echo "请输入1-4之间的数字"  
            ;;  
    esac  
done
IP地址合法性检查:使用了一个简单的正则表达式来检查输入的IP地址是否合法。
IP地址回滚:在修改IP地址之前,脚本会保存原始的IP地址。如果新IP地址配置失败(通过重启网络服务检查),脚本会回滚到原始IP地址。
网络配置文件路径:根据常见的CentOS/RHEL配置,我将IP配置文件路径更改为/etc/sysconfig/network-scripts/ifcfg-ens33。如果使用的是其他Linux发行版,可能需要相应地更改此路径。
重启网络服务:在修改IP地址后,脚本尝试重启网络服务来应用更改。根据您的系统配置,这可能需要不同的命令(例如,在某些系统上可能是ifdown ens33 && ifup ens33)。
菜单循环:我添加了一个while true循环来使菜单在每次操作后重新显示,直到用户选择退出。
Python脚本:由于主要请求是Bash脚本,因此Python脚本部分未在此回答中进一步扩展。但是,可以按照类似的逻辑在Python脚本中使用subprocess模块来执行系统命令。

cpu,disk监控脚本

shell脚本

#!/bin/bash  
  
log_path="/var/log/"  
logfile="cpu_disk.log"  
  
# 获取CPU使用率  
cpu_idle=$(top -bn 1 | awk '/^%Cpu/{print $8}')  
cpu_used=$(echo "100 - $cpu_idle" | bc)  
  
if [ $cpu_used -ge 70 ]; then  
    echo "Warning: CPU使用率高于70%, 请管理员及时查看。" >> $log_path$logfile  
else  
    echo "CPU使用率正常。"  
fi  
  
# 获取磁盘使用率(这里以根分区为例)  
root_part_percent=$(df -Th | awk '/\/$/{print $(NF-1)}' | tr -d "%")  
if [ $root_part_percent -ge 80 ]; then  
    echo "警告:根分区使用率高于80%,目前使用率是 $root_part_percent%。" >> $log_path$logfile  
else  
    echo "根分区使用率正常。"  
fi

python脚本

# monitor_cpu_disk.py  
import psutil  
import logging  
  
logging.basicConfig(level=logging.DEBUG,  
                    format='%(asctime)s - %(levelname)s - %(message)s',  
                    filename='cpu_usage.log',  
                    filemode='a')  
  
cpu_usage = psutil.cpu_percent(interval=1)  
if cpu_usage >= 70:  
    logging.warning(f"Warning: CPU使用率高于70%, 目前的使用率为{cpu_usage}%")  
else:  
    logging.info("CPU使用率正常。")  
  
# monitor_disk.py  
import psutil  
  
partitions = psutil.disk_partitions()  
for partition in partitions:  
    usage = psutil.disk_usage(partition.mountpoint)  
    percent_used = (usage.used / usage.total) * 100  
    if percent_used >= 80:  
        print(f"警告:分区 {partition.device} 在 {partition.mountpoint} 的使用率高于80%,当前使用率为 {percent_used:.2f}%")

一键安装nginx,一键卸载nginx脚本

#!/bin/bash  
  
# 安装依赖包  
yum install gcc pcre-devel openssl-devel -y  
  
# 新建用户  
id caojie || useradd caojie  
  
# 下载和解压Nginx源码  
mkdir -p /nginx  
cd /nginx  
curl -O https://nginx.org/download/nginx-1.25.5.tar.gz  
tar xf nginx-1.25.5.tar.gz  
cd nginx-1.25.5  
  
# 编译安装  
./configure --prefix=/usr/local/caojie --user=caojie --group=caojie --with-http_ssl_module --with-http_v2_module --with-stream  
if [ $? -ne 0 ]; then  
    echo "编译配置出错,请检查。"  
    exit 1  
fi  
make -j 2  
make install  
  
# 设置PATH变量  
echo "PATH=/usr/local/caojie/sbin/:$PATH" >> /etc/bashrc  
source /etc/bashrc  
  
# 启动Nginx并设置开机启动  
/usr/local/caojie/sbin/nginx && echo "Nginx启动成功" || echo "Nginx启动失败"  
echo "/usr/local/caojie/sbin/nginx" >> /etc/rc.d/rc.local  
chmod +x /etc/rc.d/rc.local  
  
# 关闭防火墙和SELinux  
systemctl stop firewalld  
systemctl disable firewalld  
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config  
setenforce 0
#!/bin/bash  
  
# 停止Nginx服务  
/usr/local/caojie/sbin/nginx -s stop  
  
# 删除PATH变量里的相关路径  
sed -i '/\/usr\/local\/caojie\/sbin\//d' /etc/bashrc  
source /etc/bashrc  
  
# 删除Nginx目录  
rm -rf /usr/local/caojie  
  
# 删除开机启动项  
sed -i '/\/usr\/local\/caojie\/sbin\/nginx/d' /etc/rc.d/rc.local

数据库备份脚本

#!/bin/bash  
  
# 数据库配置  
DB_USER="your_username"  
DB_PASSWORD="your_password"  
DB_NAME="your_database_name"  
BACKUP_DIR="/path/to/your/backup/directory"  
DATE=$(date +%Y%m%d%H%M%S)  
BACKUP_FILE="$BACKUP_DIR/$DB_NAME-$DATE.sql"  
  
# 创建备份目录(如果不存在)  
mkdir -p "$BACKUP_DIR"  
  
# 执行备份  
mysqldump -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > "$BACKUP_FILE"  
  
if [ $? -eq 0 ]; then  
    echo "Database backup successful: $BACKUP_FILE"  
else  
    echo "Database backup failed"  
fi

数据库操作脚本

#!/bin/bash  
  
# 数据库配置  
DB_HOST="localhost"  
DB_USER="your_username"  
DB_PASSWORD="your_password"  
DB_NAME="your_database_name"  
  
# SQL命令(示例:创建一个新表)  
SQL_COMMAND="CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL);"  
  
# 连接到MySQL并执行SQL命令  
mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" -e "$SQL_COMMAND"  
  
if [ $? -eq 0 ]; then  
    echo "SQL command executed successfully"  
else  
    echo "SQL command execution failed"  
fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值