Shell脚本如何设置用户磁盘配额

wen 实用脚本 1

本文目录导读:

Shell脚本如何设置用户磁盘配额

  1. 基础环境准备
  2. 启用配额的文件系统
  3. 完整配额设置脚本
  4. 其他实用脚本
  5. 使用说明
  6. 注意事项

在Linux系统中,通过Shell脚本设置用户磁盘配额主要涉及以下步骤:

基础环境准备

检查并安装配额工具

#!/bin/bash
# 安装配额工具(CentOS/RHEL)
yum install -y quota
# 或Ubuntu/Debian
apt-get install -y quota

检查内核支持

if [ -f /proc/config.gz ]; then
    zcat /proc/config.gz | grep CONFIG_QUOTA
else
    grep QUOTA /boot/config-$(uname -r)
fi

启用配额的文件系统

修改/etc/fstab

#!/bin/bash
MOUNT_POINT="/home"
# 在挂载选项中添加usrquota和grpquota
sed -i "s|\($MOUNT_POINT.*defaults\)|\1,usrquota,grpquota|" /etc/fstab

重新挂载文件系统

mount -o remount $MOUNT_POINT

完整配额设置脚本

#!/bin/bash
# ===== 配置参数 =====
MOUNT_POINT="/home"          # 配额应用的文件系统
USER_NAME="testuser"         # 目标用户
SOFT_LIMIT="500M"           # 软限制
HARD_LIMIT="600M"           # 硬限制
INODE_SOFT="10000"          # 文件数软限制
INODE_HARD="12000"          # 文件数硬限制
GRACE_PERIOD="7"            # 宽限期(天)
# ===== 颜色输出 =====
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# ===== 函数定义 =====
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}
# 检查是否为root用户
check_root() {
    if [ "$EUID" -ne 0 ]; then
        log_error "请使用root用户运行此脚本"
        exit 1
    fi
}
# 检查配额是否已启用
check_quota_enabled() {
    if mount | grep "$MOUNT_POINT" | grep -q "usrquota"; then
        log_info "用户配额已启用"
        return 0
    else
        log_warn "用户配额未启用,正在启用..."
        return 1
    fi
}
# 启用配额支持
enable_quota() {
    # 备份fstab
    cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d_%H%M%S)
    # 添加配额选项
    sed -i "s|\($MOUNT_POINT.*defaults\)|\1,usrquota,grpquota|" /etc/fstab
    # 重新挂载
    mount -o remount $MOUNT_POINT
    # 创建配额数据库
    quotacheck -cug $MOUNT_POINT
    # 启用配额
    quotaon -v $MOUNT_POINT
    log_info "配额支持已启用"
}
# 设置用户配额
set_user_quota() {
    local user=$1
    local soft=$2
    local hard=$3
    local inode_soft=$4
    local inode_hard=$5
    # 检查用户是否存在
    if ! id "$user" &>/dev/null; then
        log_error "用户 $user 不存在"
        return 1
    fi
    # 转换大小格式
    convert_size() {
        local size=$1
        case $size in
            *G|*g) echo $((${size%[Gg]} * 1024 * 1024)) ;;
            *M|*m) echo $((${size%[Mm]} * 1024)) ;;
            *K|*k) echo ${size%[Kk]} ;;
            *) echo $size ;;
        esac
    }
    soft_blocks=$(convert_size $soft)
    hard_blocks=$(convert_size $hard)
    # 设置磁盘配额
    setquota -u $user $soft_blocks $hard_blocks $inode_soft $inode_hard $MOUNT_POINT
    if [ $? -eq 0 ]; then
        log_info "用户 $user 配额设置成功"
        log_info "  磁盘限制: 软限制=$soft, 硬限制=$hard"
        log_info "  文件限制: 软限制=$inode_soft, 硬限制=$inode_hard"
        return 0
    else
        log_error "用户 $user 配额设置失败"
        return 1
    fi
}
# 设置宽限期
set_grace_period() {
    local days=$1
    # 设置宽限期(秒)
    local seconds=$((days * 24 * 60 * 60))
    setquota -t $seconds $seconds $MOUNT_POINT
    if [ $? -eq 0 ]; then
        log_info "宽限期设置为 $days 天"
        return 0
    else
        log_error "宽限期设置失败"
        return 1
    fi
}
# 查看配额信息
show_quota_info() {
    local user=$1
    echo "=========================================="
    echo "用户 $user 的磁盘配额信息"
    echo "=========================================="
    quota -u $user
    echo ""
    echo "详细报告:"
    repquota -a | grep $user
}
# 批量设置用户配额
batch_set_quota() {
    local user_file=$1
    if [ ! -f "$user_file" ]; then
        log_error "用户列表文件 $user_file 不存在"
        return 1
    fi
    while IFS=',' read -r user soft hard inode_soft inode_hard; do
        # 跳过注释和空行
        [[ $user =~ ^#.*$ ]] && continue
        [[ -z $user ]] && continue
        set_user_quota "$user" "$soft" "$hard" "$inode_soft" "$inode_hard"
    done < "$user_file"
}
# ===== 主函数 =====
main() {
    check_root
    echo "===== 磁盘配额设置脚本 ====="
    # 检查并启用配额
    if ! check_quota_enabled; then
        enable_quota
    fi
    # 设置单个用户配额
    echo ""
    log_info "正在设置用户 $USER_NAME 的配额..."
    set_user_quota "$USER_NAME" "$SOFT_LIMIT" "$HARD_LIMIT" "$INODE_SOFT" "$INODE_HARD"
    # 设置宽限期
    log_info "正在设置宽限期..."
    set_grace_period "$GRACE_PERIOD"
    # 显示配额信息
    show_quota_info "$USER_NAME"
    echo ""
    log_info "配额设置完成"
}
# 执行主函数
main

其他实用脚本

检查配额使用情况

#!/bin/bash
# 配额监控脚本
THRESHOLD=80  # 使用率阈值百分比
echo "时间: $(date)"
echo "磁盘配额使用情况检查:"
repquota -a | while read line; do
    # 检查用户配额使用率
    if echo "$line" | grep -qE "^[a-z]"; then
        user=$(echo "$line" | awk '{print $1}')
        used=$(echo "$line" | awk '{print $3}')
        soft=$(echo "$line" | awk '{print $4}')
        if [ -n "$soft" ] && [ "$soft" != "0" ]; then
            usage=$((used * 100 / soft))
            if [ "$usage" -ge "$THRESHOLD" ]; then
                echo "警告: 用户 $user 磁盘使用率已达 ${usage}%"
                # 可以添加邮件通知
                # echo "用户 $user 磁盘配额使用率: ${usage}%" | mail -s "磁盘配额警告" admin@example.com
            fi
        fi
    fi
done

删除用户配额

#!/bin/bash
delete_user_quota() {
    local user=$1
    if [ -z "$user" ]; then
        echo "请指定用户名"
        return 1
    fi
    # 删除用户配额
    setquota -u $user 0 0 0 0 /home
    # 强制同步
    sync
    echo "用户 $user 的配额已删除"
}

使用说明

  1. 保存脚本:将脚本保存为 setup_quota.sh
  2. 添加执行权限chmod +x setup_quota.sh
  3. 运行脚本sudo ./setup_quota.sh

注意事项

  • ⚠️ 需要 root 权限运行
  • 确保文件系统支持配额功能
  • 建议先在测试环境验证
  • 定期检查配额使用情况
  • 合理设置软限制和硬限制的差异

这个脚本提供了完整的磁盘配额管理功能,可以根据实际需求进行调整和扩展。

抱歉,评论功能暂时关闭!