【问题标题】:Passing Command to Mongo Shell with --eval returns undefined使用 --eval 将命令传递给 Mongo Shell 返回 undefined
【发布时间】:2018-06-13 23:30:37
【问题描述】:

我正在尝试编写一个脚本来为使用 Powershell(Server2016 附带的任何版本)的客户部署 mongodb。我可以作为服务安装并让它正常运行,但我还想添加身份验证。具体来说,我想添加一个管理员用户和数据库用户。

最初我用这个 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 我控制 [initandlisten] ** 警告: 没有为数据库启用访问控制。 2018-06-13T16:00:26.600-0700 我控制 [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 评估):1:17

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

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

【问题讨论】:

    标签: mongodb powershell mongo-shell


    【解决方案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 插入“字符串”的规则相同。

    【讨论】:

    • 天哪,这是我似乎有心理障碍的(非常多)事情之一。非常感谢。第一个提议的解决方案完美运行!
    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多