如何编写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绑定到文件描述符3read -r user <&3:从描述符3读取一行作为用户名,同时从描述符4读取对应密码,确保行号严格对应
注意事项:
- 脚本必须以root权限运行(
sudo ./your_script.sh),因为useradd和chpasswd需要管理员权限 - 确保
usernames和passwords文件中没有空行,否则会导致无效的用户/密码配置
内容的提问来源于stack exchange,提问作者Nicat Rasulov
相关产品推荐
相关产品推荐

