如何用脚本删除ejabberd服务器指定虚拟主机的所有用户
解决ejabberd指定虚拟主机批量删除用户的问题
方法一:优化ejabberdctl命令,屏蔽无关日志
ejabberdctl的无关日志一般输出到标准错误流(stderr),直接将stderr重定向到空设备,就能只保留纯用户列表:
ejabberdctl registered_users example.com 2>/dev/null
在此基础上,结合管道过滤掉admin用户,再批量执行删除操作:
ejabberdctl registered_users example.com 2>/dev/null | grep -v "^admin$" | while read user; do ejabberdctl unregister "$user" example.com done
这条命令会自动删除example.com虚拟主机下除admin外的所有用户。
方法二:使用ejabberd HTTP API实现
如果更倾向于API方式操作,先确保ejabberd配置文件中启用了ejabberd_http模块,并且配置了调用registered_users和unregister命令的权限。
1. 获取指定虚拟主机的用户列表
用curl调用API获取用户列表(替换your_auth_token、your-ejabberd-host为实际值):
curl -X GET -H "Authorization: Bearer your_auth_token" \ "http://your-ejabberd-host:5280/api/registered_users?host=example.com"
返回结果为JSON格式的用户数组,示例:["admin", "user1", "user2"]
2. 过滤并批量删除用户
借助jq工具解析JSON,过滤掉admin后逐个调用删除API:
curl -X GET -H "Authorization: Bearer your_auth_token" \ "http://your-ejabberd-host:5280/api/registered_users?host=example.com" | \ jq -r '.[] | select(. != "admin")' | while read user; do curl -X POST -H "Authorization: Bearer your_auth_token" \ "http://your-ejabberd-host:5280/api/unregister" \ -d "user=$user&host=example.com" done
如果没有jq工具,也可以用其他JSON解析工具或手动处理返回字符串。
另外,使用API前需确认ejabberd的权限配置正确,比如在ejabberd.yml中添加类似配置:
commands_admin_access: configure commands: - add_commands: [registered_users, unregister] api_permissions: "api": who: all what: ["registered_users", "unregister"]
可根据实际安全需求调整权限范围,避免过度开放。
内容的提问来源于stack exchange,提问作者nick_j_white
相关产品推荐
相关产品推荐

