show dbs给出"Not Authorized to command command"错误

Anj*_*jou 18 mongodb

我花了一些时间试图弄清楚出了什么问题,但由于我无法找到,我决定在这里问一下.

我在Windows 8上运行MongoDB(Windows 64位2008 R2 +)版本3.2.3,路径是:

C:\ MongoDB\bin用于安装

数据文件夹的C:\ data\db

我已从官方文档中安装了此视频本教程.

第一个问题可能是,因为我根本不知道它是否是一个问题,客户端(mongo.exe)和服务器(mongod.exe)之间的连接.

我通过命令行(具有管理员权限)发起了mongod.exe,一切都很顺利,我收到了消息:

waiting for connections on port 27017
Run Code Online (Sandbox Code Playgroud)

但是当我通过命令行的新实例启动mongo.exe时,服务器(mongod.exe)不会打印一条消息,说明有新的连接(我观看的教程就是这种情况)

另一方面,mongo.exe打印

connecting to : test
Run Code Online (Sandbox Code Playgroud)

我不知道此时是否一切正确,但我仍然尝试了一些基本命令,如:

show dbs 回报 not authorized on admin to execute command

基本上,我尝试的所有命令都有相同的错误消息,即使我刚创建的"新鲜"数据库也是如此 use 'dbName'

网上的一些答案说我必须创建一个具有适当角色的用户,我试过这个.仍然是相同的错误消息not authorized to execute command

我的问题如下:

我启动mongo.exe时mongod.exe没有显示新连接是正常的吗?如果它是正确的,那么即使基本命令可以做什么呢?

其他信息:

我试图在Windows安装程序中使用"自定义模式"和"完成模式"卸载/重新安装几次,但它总是会导致同样的问题.

我还尝试按照官方文档创建一个MongoDB服务,但我不确定这是不是一个好主意.(我无法添加更多链接,但它位于我分享的第二个链接的一个部分中.

编辑部分:

我决定在另一台计算机上试用它,这台计算机多年来一直没有触及,运行在Windows 7 64位上.

我在这台计算机的根目录下复制了MongoDB安装文件夹,创建了\ data\db文件夹并启动了mongod.exe.

然后我启动了mongo.exe,这次,mongod.exe打印了一条消息,说有一个新的打开连接,它不在我的实际计算机上.我认为问题出在这里是因为我能够从官方文档开始基本教程并执行简单的命令,比如创建一个新的数据库,插入,查找,显示数据库等等.我在实际计算机上无法做的一切.

所以我认为问题来自mongod.exe和mongo.exe之间的连接

您是否知道如何解决此问题,因为我已尝试卸载几次.

Yuc*_*uci 29

您应该已经启动了具有访问控制的mongod实例,即--auth命令行选项,例如:

$ mongod --auth
Run Code Online (Sandbox Code Playgroud)

让我们启动mongo shell,并在admin数据库中创建一个管理员:

$ mongo
> use admin
> db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)
Run Code Online (Sandbox Code Playgroud)

现在,如果您运行命令"db.stats()"或"show users",您将收到错误"管理员未授权执行命令..."

> db.stats()
{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { dbstats: 1.0, scale: undefined }",
        "code" : 13,
        "codeName" : "Unauthorized"
}
Run Code Online (Sandbox Code Playgroud)

原因是您仍未向用户myUserAdmin授予角色"read"或"readWrite".你可以这样做:

> db.auth("myUserAdmin", "abc123")
> db.grantRolesToUser("myUserAdmin", [ { role: "read", db: "admin" } ])
Run Code Online (Sandbox Code Playgroud)

现在你可以验证它(命令"show users"现在可以工作):

> show users
{
        "_id" : "admin.myUserAdmin",
        "user" : "myUserAdmin",
        "db" : "admin",
        "roles" : [
                {
                        "role" : "read",
                        "db" : "admin"
                },
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ]
}
Run Code Online (Sandbox Code Playgroud)

现在如果你运行"db.stats()",你也可以:

> db.stats()
{
        "db" : "admin",
        "collections" : 2,
        "views" : 0,
        "objects" : 3,
        "avgObjSize" : 151,
        "dataSize" : 453,
        "storageSize" : 65536,
        "numExtents" : 0,
        "indexes" : 3,
        "indexSize" : 81920,
        "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)

除了admin数据库之外,此用户和角色机制也可以应用于MongoDB中的任何其他数据库.

(MongoDB版本3.4.3)


Jas*_*rne 13

创建一个这样的用户:

db.createUser(
      {
        user: "myUserAdmin",
        pwd: "abc123",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
      }
    )
Run Code Online (Sandbox Code Playgroud)

然后按照以下方式连接它:

mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
Run Code Online (Sandbox Code Playgroud)

查看手册:

https://docs.mongodb.org/manual/tutorial/enable-authentication/


小智 9

另外,在按照cmd-1创建用户后,请通过cmd-2为用户分配读/写/ root角色.然后通过cmd"mongod --auth"重新启动mongodb.

为用户分配角色的好处是你可以通过mongo shell或python/java等进行读/写操作,否则当你尝试读/写你的数据库时你会遇到"pymongo.errors.OperationFailure:not authorized" .

CMD-1:

use admin
db.createUser({
  user: "newUsername",
  pwd: "password",
  roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})
Run Code Online (Sandbox Code Playgroud)

CMD-2:

db.grantRolesToUser('newUsername',[{ role: "root", db: "admin" }])
Run Code Online (Sandbox Code Playgroud)


Lia*_*iam 6

发布的答案OP副本:

从上一次编辑更新后,我看了一下客户端和服务器之间的连接,我发现即使mongod.exe没有运行,仍然有东西在端口27017上侦听netstat -a

所以我尝试使用随机端口启动服务器

[dir]mongod.exe --port 2000
Run Code Online (Sandbox Code Playgroud)

然后用shell

[dir]mongo.exe --port 2000
Run Code Online (Sandbox Code Playgroud)

而这一次,服务器打印出一条消息,说有一个新的连接.我键入了一些命令,一切都工作得很好,我从文档中开始基本教程,检查它是否正常,现在是.