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

Zenity创建用户及密码设置脚本故障排查与修复咨询

修复Zenity用户创建脚本:避免误改root密码并正确完成用户创建

我是Zenity新手,希望创建一个用于新建用户和设置密码的GUI。我的代码如下:

#!/bin/bash
zenity --info --text='Welcome to Account Creation Wizard'
zenity --entry --text='What do you want to set your username as?' > username
zenity --password > test
cat username >> username1
cat username >> username1
cat test >> test1
cat test >> test1
useradd -m < username1
passwd < username1 < test1
rm test test1
rm username username1
exit

但脚本无法正常工作,终端输出如下:

[root@archevaris Desktop]# ./UserCreator.sh
Usage: useradd [options] LOGIN
useradd -D
useradd -D [options]
...(省略useradd帮助内容)
New password: Retype new password: passwd: password updated successfully

实际脚本修改了root密码(好在是在虚拟机快照中执行),请问如何修复该脚本?需要做出哪些代码调整?


问题根源分析

你的脚本出现三个核心问题,直接导致了错误行为:

  1. useradd 参数使用错误:useradd 需要直接将用户名作为命令行参数传入,而不是通过标准输入读取。你用 < username1 试图传递用户名,但 username1 里重复写入了两次用户名,且这种重定向方式不符合 useradd 的用法,导致命令报错并退出。
  2. passwd 目标用户错误 + 输入方式错误:当你不带用户名运行 passwd 时,它默认修改当前用户(这里是root)的密码。同时你用两次重定向 < username1 < test1,实际上只有最后一个重定向生效,前面的会被覆盖,而且你没有指定要修改密码的目标用户,最终导致误改了root密码。
  3. 冗余的临时文件操作:重复执行 cat username >> username1 和 cat test >> test1 完全没必要,反而制造了无效的输入内容。

修复后的脚本

#!/bin/bash

# 显示欢迎信息
zenity --info --text='Welcome to Account Creation Wizard'

# 获取用户名,检查用户是否取消输入
username=$(zenity --entry --text='What do you want to set your username as?' --title="Create New User")
if [ $? -ne 0 ]; then
    zenity --error --text="Username entry cancelled. Exiting."
    exit 1
fi

# 获取密码,检查用户是否取消输入
password=$(zenity --password --title="Set Password for $username")
if [ $? -ne 0 ]; then
    zenity --error --text="Password entry cancelled. Exiting."
    exit 1
fi

# 创建用户(带家目录)
if ! useradd -m "$username"; then
    zenity --error --text="Failed to create user $username. Check terminal for details."
    exit 1
fi

# 设置用户密码:使用chpasswd更可靠,避免passwd的交互问题
echo "$username:$password" | chpasswd

# 操作成功提示
zenity --info --text="User $username created successfully with the specified password."

exit 0

关键改动说明

  • 用变量替代临时文件:直接将Zenity的输出存入username和password变量,避免创建冗余的临时文件,代码更简洁安全。
  • 添加取消输入的判断:当用户点击Zenity窗口的取消按钮时,脚本会捕获退出码并给出提示后退出,避免后续错误执行。
  • 正确调用useradd:直接将$username作为参数传给useradd -m,符合命令的标准用法,确保创建带家目录的用户。
  • 改用chpasswd设置密码:chpasswd命令支持从标准输入读取用户名:密码的格式,比passwd更适合脚本自动化场景,彻底避免了误改root密码的风险。
  • 添加错误处理:对useradd的执行结果进行检查,如果失败则弹出错误提示,方便排查问题。

内容的提问来源于stack exchange,提问作者simonknowsstuff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:22:49