自动设置文件夹权限脚本怎么写

wen 实用脚本 1

本文目录导读:

自动设置文件夹权限脚本怎么写

  1. Windows PowerShell 脚本
  2. Linux Bash 脚本
  3. Windows 批处理脚本 (CMD)
  4. 使用示例

我来帮你编写一个自动设置文件夹权限的脚本,根据不同操作系统提供多个版本。

Windows PowerShell 脚本

# 设置文件夹权限脚本
param(
    [string]$FolderPath = "C:\SharedFolder",
    [string]$UserName = "Domain Users",
    [string]$Permission = "Read",  # FullControl, Modify, Read, Write
    [switch]$InheritPermission,
    [switch]$RemoveExistingPermissions
)
function Set-FolderPermissions {
    param(
        [string]$Path,
        [string]$User,
        [string]$PermissionType,
        [bool]$Inherit,
        [bool]$RemoveExisting
    )
    # 检查文件夹是否存在
    if (-not (Test-Path $Path)) {
        Write-Host "创建文件夹: $Path" -ForegroundColor Yellow
        New-Item -ItemType Directory -Path $Path -Force | Out-Null
    }
    # 获取当前权限
    $acl = Get-Acl -Path $Path
    # 如果需要移除现有权限
    if ($RemoveExisting) {
        $acl.Access | ForEach-Object {
            $acl.RemoveAccessRule($_)
        }
    }
    # 创建访问规则
    $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
        $User,
        $PermissionType,
        $([System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor 
          [System.Security.AccessControl.InheritanceFlags]::ObjectInherit),
        [System.Security.AccessControl.PropagationFlags]::None,
        [System.Security.AccessControl.AccessControlType]::Allow
    )
    # 添加访问规则
    $acl.AddAccessRule($accessRule)
    # 设置权限
    try {
        Set-Acl -Path $Path -AclObject $acl
        Write-Host "成功设置权限!" -ForegroundColor Green
        Write-Host "文件夹: $Path" -ForegroundColor Cyan
        Write-Host "用户: $User" -ForegroundColor Cyan
        Write-Host "权限: $PermissionType" -ForegroundColor Cyan
    }
    catch {
        Write-Error "设置权限失败: $_"
    }
    # 显示当前权限
    Write-Host "`n当前文件夹权限:" -ForegroundColor Yellow
    Get-Acl -Path $Path | Select-Object -ExpandProperty Access | Format-Table
}
# 执行权限设置
Set-FolderPermissions -Path $FolderPath -User $UserName -PermissionType $Permission -Inherit $InheritPermission.IsPresent -RemoveExisting $RemoveExistingPermissions.IsPresent

Linux Bash 脚本

#!/bin/bash
# 文件夹权限设置脚本
# 默认配置
FOLDER_PATH="/path/to/folder"  # 修改为你的文件夹路径
USER_NAME="user_name"          # 修改为用户名
GROUP_NAME="group_name"        # 修改为用户组
PERMISSION="755"               # 权限模式:755(rwxr-xr-x), 700(rwx------)
OWNER_USER="webserver_user"    # 所有者用户,如www-data, nginx
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# 显示使用方法
show_usage() {
    echo "使用方法: $0 -p <文件夹路径> [选项]"
    echo ""
    echo "选项:"
    echo "  -p <路径>         文件夹路径 (必需)"
    echo "  -u <用户>        设置用户权限"
    echo "  -g <组>          设置组权限"
    echo "  -m <权限模式>     设置权限模式 (如 755, 700)"
    echo "  -o <所有者>      设置文件夹所有者"
    echo "  -r               递归设置子文件夹"
    echo "  -h               显示帮助信息"
    echo ""
    echo "示例:"
    echo "  $0 -p /var/www/html -u john -g www-data -m 755 -o www-data -r"
    exit 0
}
# 检查是否为root用户
check_root() {
    if [ "$(id -u)" != "0" ]; then
        echo -e "${RED}错误: 此脚本需要root权限!${NC}"
        echo "请使用 sudo 运行此脚本"
        exit 1
    fi
}
# 设置文件夹权限
set_folder_permissions() {
    local path="$1"
    local user="$2"
    local group="$3"
    local perm="$4"
    local owner="$5"
    local recursive="$6"
    # 检查文件夹是否存在
    if [ ! -d "$path" ]; then
        echo -e "${YELLOW}创建文件夹: $path${NC}"
        mkdir -p "$path"
        if [ $? -ne 0 ]; then
            echo -e "${RED}创建文件夹失败!${NC}"
            exit 1
        fi
    fi
    # 递归或非递归设置
    if [ "$recursive" = true ]; then
        chmod_opt="-R"
        chown_opt="-R"
    else
        chmod_opt=""
        chown_opt=""
    fi
    # 设置所有者
    if [ -n "$owner" ]; then
        if echo "$owner" | grep -q ":"; then
            # 格式: user:group
            chown $chown_opt "$owner" "$path"
        else
            # 只设置用户
            chown $chown_opt "$owner:$owner" "$path"
        fi
        echo -e "${GREEN}设置所有者: $owner${NC}"
    fi
    # 设置组
    if [ -n "$group" ] && [ -z "$owner" ]; then
        chgrp $chown_opt "$group" "$path"
        echo -e "${GREEN}设置组: $group${NC}"
    fi
    # 设置用户权限
    if [ -n "$user" ]; then
        # 设置ACL权限
        if command -v setfacl &> /dev/null; then
            if [ "$recursive" = true ]; then
                setfacl -R -m "u:$user:rwx" "$path"
                setfacl -R -m "d:u:$user:rwx" "$path"
            else
                setfacl -m "u:$user:rwx" "$path"
            fi
            echo -e "${GREEN}使用ACL设置用户 $user 权限${NC}"
        else
            echo -e "${YELLOW}未安装ACL工具,使用传统权限设置${NC}"
        fi
    fi
    # 设置权限模式
    if [ -n "$perm" ]; then
        chmod $chmod_opt "$perm" "$path"
        echo -e "${GREEN}设置权限模式: $perm${NC}"
    fi
    # 显示结果
    echo -e "${CYAN}文件夹: $path${NC}"
    if [ "$recursive" = true ]; then
        ls -la "$path"
    else
        ls -la "$path" | head -2
    fi
}
# 主函数
main() {
    # 检查root权限
    check_root
    # 如果无参数,显示帮助
    if [ $# -eq 0 ]; then
        show_usage
    fi
    # 解析参数
    local path=""
    local user=""
    local group=""
    local perm=""
    local owner=""
    local recursive=false
    while getopts "p:u:g:m:o:rh" opt; do
        case $opt in
            p)
                path="$OPTARG"
                ;;
            u)
                user="$OPTARG"
                ;;
            g)
                group="$OPTARG"
                ;;
            m)
                perm="$OPTARG"
                ;;
            o)
                owner="$OPTARG"
                ;;
            r)
                recursive=true
                ;;
            h)
                show_usage
                ;;
            \?)
                echo -e "${RED}无效选项: -$OPTARG${NC}" >&2
                show_usage
                ;;
        esac
    done
    # 检查必需参数
    if [ -z "$path" ]; then
        echo -e "${RED}错误: 必需指定文件夹路径 (-p)${NC}"
        show_usage
    fi
    # 设置权限
    set_folder_permissions "$path" "$user" "$group" "$perm" "$owner" "$recursive"
    # 显示权限摘要
    echo ""
    echo -e "${YELLOW}权限设置完成!${NC}"
    echo "路径: $path"
    echo "用户: ${user:-未设置}"
    echo "组: ${group:-未设置}"
    echo "权限模式: ${perm:-未更改}"
    echo "所有者: ${owner:-未更改}"
    echo "递归: $recursive"
}
# 执行主函数
main "$@"

Windows 批处理脚本 (CMD)

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
:: 设置文件夹权限批处理脚本
:: 默认配置
set "FOLDER_PATH=C:\SharedFolder"
set "USER_NAME=Everyone"
set "PERMISSION=F"  REM F=完全控制, R=读取, M=修改, W=写入
echo ========================================
echo       文件夹权限设置工具
echo ========================================
echo.
:: 检查文件夹
if not exist "%FOLDER_PATH%" (
    echo [信息] 创建文件夹: %FOLDER_PATH%
    mkdir "%FOLDER_PATH%"
    if !errorlevel! neq 0 (
        echo [错误] 创建文件夹失败!
        pause
        exit /b 1
    )
)
:: 移除现有权限
echo [信息] 移除现有权限...
icacls "%FOLDER_PATH%" /grant "SYSTEM:(OI)(CI)F" /T
icacls "%FOLDER_PATH%" /grant "BUILTIN\Administrators:(OI)(CI)F" /T
icacls "%FOLDER_PATH%" /reset /T
:: 设置新权限
echo [信息] 设置用户权限...
icacls "%FOLDER_PATH%" /grant "%USER_NAME%:(OI)(CI)%PERMISSION%" /T
:: 验证权限
echo.
echo [信息] 当前文件夹权限:
icacls "%FOLDER_PATH%"
:: 完成
echo.
echo ========================================
echo       权限设置完成!
echo ========================================
echo 文件夹: %FOLDER_PATH%
echo 用户: %USER_NAME%
echo 权限: %PERMISSION%
echo.
pause

使用示例

Windows PowerShell:

# 基本使用
.\Set-FolderPermissions.ps1 -FolderPath "D:\Shared" -UserName "Everyone" -Permission "Read"
# 递归设置子文件夹
.\Set-FolderPermissions.ps1 -FolderPath "D:\Project" -UserName "Domain Users" -Permission "Modify"

Linux:

# 设置权限和所有者
sudo ./folder_permissions.sh -p /var/www/html -u www-data -g www-data -m 755 -o www-data -r
# 使用ACL设置
sudo ./folder_permissions.sh -p /shared/folder -u john -m 770

Windows CMD:

:: 设置完全控制权限
folder_permissions.bat
:: 或直接使用icacls
icacls "D:\MyFolder" /grant "Users:(OI)(CI)R" /T

这些脚本提供了灵活的方式来设置文件夹权限,选择适合你操作系统的版本,并根据实际需求调整参数。

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