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

如何编写Bash脚本为每个用户设置对应文件中的密码?

解决方法:实现用户名与对应密码的批量配置

问题核心是原脚本未实现逐行配对读取两个文件的内容,导致所有用户共用同一个密码。以下提供两种可靠的修改方案,确保每个用户匹配对应行的密码:

方案一:用paste合并文件后循环处理

这种方法通过paste命令将两个文件的对应行合并,再逐行拆分用户名和密码进行操作,代码简洁直观:

#!/bin/bash

# 先检查两个文件行数是否一致,避免配对错误
if [ $(wc -l < usernames) -ne $(wc -l < passwords) ]; then
    echo "错误:usernames和passwords文件行数不匹配"
    exit 1
fi

# 合并文件并逐行处理
paste usernames passwords | while read -r user pass; do
    # 检查用户是否已存在,不存在则创建
    if ! id -u "$user" >/dev/null 2>&1; then
        useradd "$user"
        echo "已创建用户:$user"
    fi
    # 为用户设置对应密码
    echo "$user:$pass" | chpasswd
    echo "已为用户 $user 设置对应密码"
done

关键说明:

  • paste usernames passwords:将两个文件的对应行合并为一行,用制表符分隔用户名和密码
  • read -r user pass:把合并后的每行拆分为user(用户名)和pass(密码)两个变量
  • chpasswd:通过管道输入用户名:密码格式直接设置密码,比passwd --stdin更高效

方案二:用文件描述符同时读取两个文件

如果需要更灵活地单独控制两个文件的读取逻辑,可以使用文件描述符实现同步读取:

#!/bin/bash

# 检查文件行数一致性
if [ $(wc -l < usernames) -ne $(wc -l < passwords) ]; then
    echo "错误:usernames和passwords文件行数不匹配"
    exit 1
fi

# 打开文件描述符3和4,分别指向两个文件
exec 3<usernames
exec 4<passwords

# 同步读取两个文件的对应行
while read -r user <&3 && read -r pass <&4; do
    if ! id -u "$user" >/dev/null 2>&1; then
        useradd "$user"
        echo "已创建用户:$user"
    fi
    echo "$user:$pass" | chpasswd
    echo "已为用户 $user 设置对应密码"
done

# 关闭文件描述符
exec 3<&-
exec 4<&-

关键说明:

  • exec 3<usernames:将文件usernames绑定到文件描述符3
  • read -r user <&3:从描述符3读取一行作为用户名,同时从描述符4读取对应密码,确保行号严格对应

注意事项:

  1. 脚本必须以root权限运行(sudo ./your_script.sh),因为useradd和chpasswd需要管理员权限
  2. 确保usernames和passwords文件中没有空行,否则会导致无效的用户/密码配置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 11:52:09