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
相关产品推荐
相关产品推荐

