You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本开发求助:用户目录处理与文件生成问题

修正后的完整Bash脚本
#!/bin/bash

# 读取目标用户名
read -p "请输入用户名: " username

# 检查用户是否存在并输出信息/创建用户
if id "$username" &>/dev/null; then
    echo "用户 $username 已存在,信息如下:"
    uid=$(id -u "$username")
    shell=$(getent passwd "$username" | cut -d: -f7)
    home_dir=$(getent passwd "$username" | cut -d: -f6)
    groups=$(id -Gn "$username")
    
    echo "UID: $uid"
    echo "默认Shell: $shell"
    echo "主目录: $home_dir"
    echo "所属组: $groups"
else
    echo "用户 $username 不存在,正在创建..."
    # 检查是否拥有root权限(创建用户必需)
    if [[ $EUID -ne 0 ]]; then
        echo "错误:创建用户需要root权限,请使用sudo运行此脚本。"
        exit 1
    fi
    # 创建用户并自动生成主目录
    useradd -m "$username"
    if [[ $? -eq 0 ]]; then
        echo "用户 $username 创建成功。"
        # 输出新用户基础信息
        uid=$(id -u "$username")
        shell=$(getent passwd "$username" | cut -d: -f7)
        home_dir=$(getent passwd "$username" | cut -d: -f6)
        groups=$(id -Gn "$username")
        
        echo "UID: $uid"
        echo "默认Shell: $shell"
        echo "主目录: $home_dir"
        echo "所属组: $groups"
    else
        echo "错误:用户创建失败,请检查参数或系统配置。"
        exit 1
    fi
fi

# 列出用户拥有的所有目录及访问权限
echo -e "\n用户 $username 拥有的目录及权限:"
# 遍历系统查找用户目录,屏蔽权限不足的错误提示
directories=$(find / -type d -user "$username" 2>/dev/null)
if [[ -z "$directories" ]]; then
    echo "未找到该用户拥有的目录。"
else
    for dir in $directories; do
        perm=$(stat -c "%A" "$dir")
        echo "$perm $dir"
    done
fi

# 在每个目标目录创建summary.txt文件
echo -e "\n正在生成summary.txt文件..."
for dir in $directories; do
    # 检查当前目录是否具备写入权限
    if [[ -w "$dir" ]]; then
        summary_path="$dir/summary.txt"
        # 写入目录列表和总大小信息
        echo "目录列表:" > "$summary_path"
        ls -l "$dir" >> "$summary_path"
        echo -e "\n目录及文件总大小:" >> "$summary_path"
        du -sh "$dir" >> "$summary_path"
        echo "已创建:$summary_path"
    else
        echo "无写入权限,跳过目录:$dir"
    fi
done

核心错误修正说明

1. 解决summary.txt路径错误问题

你之前的循环中大概率使用了相对路径(如直接写summary.txt),导致文件始终生成在脚本运行目录。修正方式:

  • 用目标目录绝对路径拼接文件名:summary_path="$dir/summary.txt",明确指定文件生成位置。

2. 权限问题处理

  • 创建用户权限校验:useradd必须以root身份执行,脚本通过EUID检查当前用户权限,非root时直接提示并退出。
  • 目录遍历权限屏蔽:find命令添加2>/dev/null,过滤遍历系统受限目录(如/root、/proc)时的权限报错。
  • 写入权限前置检查:创建文件前用[[ -w "$dir" ]]判断目录是否可写,无权限则跳过并提示,避免无意义报错。

3. 用户信息获取可靠性优化

  • 用id -u判断用户是否存在,比直接读取/etc/passwd更兼容LDAP等非本地用户场景。
  • 用getent passwd获取Shell和主目录,id -Gn获取所属组,避免手动切割文件的潜在错误。

4. 空目录场景处理

当用户无任何所属目录(如刚创建的新用户),脚本会直接提示,避免后续循环执行空操作。

使用注意事项

  • 必须以sudo运行脚本,否则无法创建用户或遍历部分系统目录。
  • 若只需处理用户主目录下的目录,可将find /改为find "$home_dir",大幅提升执行速度。

内容的提问来源于stack exchange,提问作者JanNiedziółka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:15:06