如何在Shell环境下为Portainer创建新的管理员用户?
嘿,这个问题我刚好有实操经验!既然你握着宿主机的root权限,完全可以通过直接操作Portainer的数据库来新增管理员,这样既不会碰原管理员的密码,也不会影响其他可能在使用系统的人。下面给你一步步拆解操作:
第一步:找到Portainer的数据库文件
Portainer默认用SQLite存储数据,核心文件是portainer.db。先通过docker ps找到Portainer容器的ID或名称,接着用docker inspect <容器ID/容器名>查看它的挂载信息,找到数据库在宿主机上的路径。比如默认情况下,这个路径通常是/var/lib/docker/volumes/portainer_data/_data/portainer.db。第二步:务必先备份数据库
这一步绝对不能省!操作数据库前先备份,避免失误搞坏现有数据:cp /path/to/portainer.db /path/to/portainer.db.backup把上面的
/path/to/替换成你实际找到的数据库路径。第三步:生成密码的bcrypt哈希值
Portainer用bcrypt加密用户密码,你得先把新管理员的密码转换成对应的哈希值。如果宿主机装了Python3和bcrypt库,直接在shell里跑这条命令(把your-new-password换成你想设置的密码):python3 -c "import bcrypt; print(bcrypt.hashpw(b'your-new-password', bcrypt.gensalt()).decode())"执行后会输出一串哈希字符串,把它复制下来备用。如果没装bcrypt,先装一下:Debian/Ubuntu用
apt install python3-bcrypt,CentOS/RHEL用yum install python3-bcrypt。第四步:操作SQLite数据库插入新用户
先确保宿主机装了sqlite3工具,没装的话:Debian/Ubuntu用apt install sqlite3,CentOS/RHEL用yum install sqlite3。然后进入数据库:sqlite3 /path/to/portainer.db进入sqlite交互环境后,执行下面的SQL语句(替换掉
new-admin为你的新用户名,your-hash-string为刚才生成的哈希值,邮箱可以留空或者填实际邮箱):INSERT INTO users (Username, PasswordHash, Role, Email, CreatedAt, UpdatedAt) VALUES ('new-admin', 'your-hash-string', 1, 'admin@example.com', strftime('%s','now'), strftime('%s','now'));执行完输入
.exit退出sqlite交互环境。第五步:重启Portainer容器让新用户生效
最后重启Portainer容器,新管理员账号就能用了:docker restart <容器ID/容器名>
完成以上步骤后,你就可以用新创建的管理员账号登录Portainer啦,完全不会影响原有的用户和配置。
备注:内容来源于stack exchange,提问作者Thorsten Schöning

