Shell脚本读取文件账号配置ocserv仅生成异常单用户如何解决
ocserv批量创建账号脚本异常修复方案
核心错误点排查
你的代码存在4个逻辑问题,直接导致创建失败:
- 数组取值逻辑完全错误:循环内未使用索引
i读取对应位置的单个用户名、密码,反而每次都展开整个用户名/密码数组做全量传参,命令解析异常时就会生成名为{username[@]}的异常用户。 - 数组读取参数缺失:
mapfile默认会保留每行末尾的换行符,读取到的用户名、密码会携带多余换行符,传给ocpasswd时会被识别为带特殊字符的异常值。 - 循环索引边界错误:Shell数组索引从0开始计数,你的循环从
i=1开始,会直接漏掉第一行的账号;另外用wc -l统计行数做循环终止条件,遇到文件末尾无换行的场景会少读最后一行数据。 ocpasswd调用参数顺序错误:该命令的格式为ocpasswd -c 密码文件路径 用户名,用户名必须作为命令参数传入,密码需要通过标准输入传两次(第一次输入密码、第二次确认密码),你的代码把全量密码数组直接管道传给命令,参数顺序和输入格式都不符合要求。
修复后代码
# 读取账号密码文件,加-t参数自动剔除每行末尾的换行符 mapfile -t password < '/home/ubuntu/randompassword.txt' mapfile -t username < '/home/ubuntu/randomusern.txt' # 前置校验:两个文件行数必须一致,避免账号密码错位 if [ ${#username[@]} -ne ${#password[@]} ]; then echo "错误:用户名文件与密码文件行数不匹配,请检查源文件" exit 1 fi # 从索引0开始遍历所有账号 for((i=0; i<${#username[@]}; i++)) do current_user="${username[i]}" current_pass="${password[i]}" # 跳过空行 if [ -z "$current_user" ] || [ -z "$current_pass" ]; then continue fi # 传入两次相同密码完成ocpasswd的密码确认校验 echo -e "${current_pass}\n${current_pass}" | ocpasswd -c "/etc/ocserv/ocpasswd" "$current_user" done
验证排查方法
正式执行创建前,可以先把循环内的ocpasswd调用行替换为
echo "待创建用户:$current_user,对应密码:$current_pass",先运行脚本确认所有账号密码匹配无错位、无空值,再放开实际创建逻辑,避免写坏ocserv密码配置文件。
内容的提问来源于stack exchange,提问作者imhere
相关产品推荐
相关产品推荐

