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

Ubuntu24.04(WSL)中while循环内useradd执行失败求助

问题原因分析

Ubuntu 24.04(含WSL环境)中的useradd命令执行时会尝试读取标准输入(stdin),而你的while循环通过done < "$input"将整个循环的标准输入绑定到了users.csv文件。这导致useradd会从users.csv中读取后续行作为输入,既干扰了read命令的正常读取逻辑,又因输入不符合预期导致写入/etc/passwd失败,最终出现报错。

低版本Ubuntu无此问题,是因为旧版useradd或其PAM配置不会默认抢占循环的输入流;单独执行的脚本能成功,是因为此时useradd的stdin是终端,不存在输入流冲突。

解决方案

以下几种方法均可解决stdin冲突问题:

方法1:将useradd的stdin重定向到/dev/null

修改循环内的useradd命令,让它从空设备读取输入,避免占用users.csv的输入流:

#!/bin/bash
# process new user accounts
input="users.csv"
while IFS=',' read -r userid name
do
 echo "adding $userid"
 useradd -c "$name" -m $userid < /dev/null
done < "$input"

方法2:用管道分离输入流

通过cat管道传递users.csv内容,让循环的输入流与useradd的stdin相互隔离:

#!/bin/bash
# process new user accounts
input="users.csv"
cat "$input" | while IFS=',' read -r userid name
do
 echo "adding $userid"
 useradd -c "$name" -m $userid
done

注:此方式下循环内的变量无法在子shell外部使用,但本脚本无此需求,可正常使用。

方法3:使用独立文件描述符读取CSV

打开一个单独的文件描述符来读取users.csv,不占用默认stdin:

#!/bin/bash
# process new user accounts
input="users.csv"
exec 3< "$input"
while IFS=',' read -r userid name <&3
do
 echo "adding $userid"
 useradd -c "$name" -m $userid
done
exec 3<&- # 关闭文件描述符
验证方式

修改后重新运行脚本,可通过以下命令验证用户是否创建成功:

cat /etc/passwd | grep -E 'rich|christine|barbara|tim'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 15:00:01