使用--eval将命令传递给Mongo Shell返回undefined

时间:2018-06-13 23:30:37

标签: mongodb powershell mongo-shell

我试图编写一个脚本来为使用Powershell的客户部署mongodb(无论Server2016附带什么版本)。我可以作为服务安装并启动并运行得很好,但我还想添加身份验证。具体来说,我想添加一个管理员用户和数据库用户。

最初我使用此powershell函数创建mongod服务:

function createMongoService([string] $mongoDbConfigPath, [string] $serviceName, [string] $storePath, [string] $authCmd)
{
    $mongodexe = "$mongoInstallPath\bin\mongod.exe"
    Write-Host "Activating Mongod as a service '$serviceName'"
    "auth cmd = $authCmd"
    & $mongodexe --config "$mongoDbConfigPath" --install --serviceName "$serviceName" --serviceDisplayName "Storfirst MongoDB" --port 27710 --dbpath "$storePath\db" $authCmd
    if ($LASTEXITCODE -ne 0)
    {
        throw "Failed to start service"
    }
}

在最初的情况下,$ authCmd是""。查看日志,我可以确认服务是在没有身份验证的情况下启动的。

  

2018-06-13T16:00:26.600-0700 I CONTROL [initandlisten] **警告:   未对数据库启用访问控制。   2018-06-13T16:00:26.600-0700 I CONTROL [initandlisten] **
  对数据和配置的读写访问不受限制。

然后我用这个函数创建mongo用户:

function createAdminUser( [string] $mongoInstallPath, [string] $mongoAdminName, [string] $mongoAdminPass)
{
    Write-Host "Creating admin user"
    $createAdminCmd = `
        "db.createUser( `
            { `
                user: `"$mongoAdminName`", 
                pwd: `"$mongoAdminPass`", 
                roles: [ { role: `"userAdminAnyDatabase`", db: `"admin`" } ] `
            } `
        );"
    "$createAdminCmd"
    & "$mongoInstallPath\bin\mongo.exe" admin --port 27710  --eval "$createAdminCmd"

    if ($LASTEXITCODE -ne 0)
    {
        throw "Failed to create admin user"
    }
}

但是这会失败,并在屏幕上显示以下错误(mongodb日志中没有记录任何内容)。 mongoAdminName在此次运行中等于管理员,但如果我使用其他内容,它会使用等效的管理员名称给出相同的结果。

  

MongoDB shell版本v3.4.15-49-g4ef027f98d连接到:   mongodb://127.0.0.1:27710 / admin MongoDB服务器版本:   3.4.15-49-g4ef027f98d 2018-06-13T16:10:00.125-0700 E QUERY [thread1] ReferenceError:未定义管理员:@(shell   EVAL):1:17

即使我在powershell中手动输入预期的命令,也会发生这种情况。 我使用类似的命令在我们的自定义mongodb docker容器上创建用户并且没有问题,但在这种情况下我需要一个非容器解决方案。

计划是,一旦我创建了管理员用户,就重新执行createMongoService,这次使用authCmd等于" - auth",然后使用admin用户创建数据库用户标准认证实践。 我的问题是"这里发生了什么?!?"和"我该如何解决这个问题?"

1 个答案:

答案 0 :(得分:1)

错误administrator is not defined实际上是指生成的输出中存在的未加引号的值。基本上这是user参数,如果您将其更改为"bill",则会得到bill is not defined。所以这不是“MongoDB错误”,而是解释器的JavaScript错误。

这是因为在双引号内插入双引号,所以解决方法是更改​​引号方案:

$createAdminCmd = 
        "db.createUser( 
            { 
                user: '" + $mongoAdminName + "', 
                pwd: '" + $mongoAdminPass + "',
                roles: [ { role: 'userAdminAnyDatabase', db: 'admin' } ] 
            } 
        );"

替代方法是以JavaScript解释器满意的方式转义双引号:

$createAdminCmd = 
        "db.createUser(
            { 
                user: \`"$mongoAdminName\`", 
                pwd: \`"$mongoAdminPass\`",
                roles: [ { role: \`"userAdminAnyDatabase\`", db: \`"admin\`" } ]
            }
        );"

然后其余的工作正常。

请记住,即使它“看起来像”你认为你可能只是在键入,但从JavaScript解释器的角度来看,它需要在执行之前“评估”内容,它仍然只是“一个字符串”。因此,相同的规则适用于JavaScript总是插入“字符串”。