使用 --eval returns 未定义将命令传递给 Mongo Shell
Passing Command to Mongo Shell with --eval returns undefined
我正在尝试编写一个脚本来为使用 Powershell(Server2016 附带的任何版本)的客户部署 mongodb。我可以作为一项服务安装并启动并 运行ning 就好了,但我还想添加身份验证。具体来说,我想添加一个管理员用户和数据库用户。
最初我使用这个 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] ** WARNING:
Access control is not enabled for the database.
2018-06-13T16:00:26.600-0700 I CONTROL [initandlisten] **
Read and write access to data and configuration is unrestricted.
然后我用这个函数去创建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 version v3.4.15-49-g4ef027f98d connecting to:
mongodb://127.0.0.1:27710/admin MongoDB server version:
3.4.15-49-g4ef027f98d 2018-06-13T16:10:00.125-0700 E QUERY [thread1] ReferenceError: administrator is not defined : @(shell
eval):1:17
即使我在 powershell 中手动输入预期的命令,也会发生这种情况。
我使用类似的命令在我们的自定义 mongodb docker 容器上创建用户并且没有遇到任何问题,但在这种情况下我需要一个非容器解决方案。
计划是,一旦我创建了管理员用户,就重新执行 createMongoService,这次 authCmd 等于“--auth”,然后使用管理员用户通过标准身份验证实践创建数据库用户。
我的问题是 "whats going on here?!?" 和 "how do I fix this?"
错误 administrator is not defined
实际上是指生成的输出中存在未引用的值。基本上这就是 user
参数,如果您将其更改为 "bill"
,那么您会得到 bill is not defined
。所以这不是 "MongoDB error" 而是解释器的 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\`" } ]
}
);"
然后剩下的就可以正常工作了。
请记住,即使它 "looks like" 您认为您可能只是在输入内容,但从 JavaScript 解释器的角度来看,它在执行之前需要 "eval" 内容,它仍然"just a string"。因此,相同的规则适用于 JavaScript 插入 "string".
我正在尝试编写一个脚本来为使用 Powershell(Server2016 附带的任何版本)的客户部署 mongodb。我可以作为一项服务安装并启动并 运行ning 就好了,但我还想添加身份验证。具体来说,我想添加一个管理员用户和数据库用户。
最初我使用这个 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] ** WARNING: Access control is not enabled for the database. 2018-06-13T16:00:26.600-0700 I CONTROL [initandlisten] **
Read and write access to data and configuration is unrestricted.
然后我用这个函数去创建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 version v3.4.15-49-g4ef027f98d connecting to: mongodb://127.0.0.1:27710/admin MongoDB server version: 3.4.15-49-g4ef027f98d 2018-06-13T16:10:00.125-0700 E QUERY [thread1] ReferenceError: administrator is not defined : @(shell eval):1:17
即使我在 powershell 中手动输入预期的命令,也会发生这种情况。 我使用类似的命令在我们的自定义 mongodb docker 容器上创建用户并且没有遇到任何问题,但在这种情况下我需要一个非容器解决方案。
计划是,一旦我创建了管理员用户,就重新执行 createMongoService,这次 authCmd 等于“--auth”,然后使用管理员用户通过标准身份验证实践创建数据库用户。 我的问题是 "whats going on here?!?" 和 "how do I fix this?"
错误 administrator is not defined
实际上是指生成的输出中存在未引用的值。基本上这就是 user
参数,如果您将其更改为 "bill"
,那么您会得到 bill is not defined
。所以这不是 "MongoDB error" 而是解释器的 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\`" } ]
}
);"
然后剩下的就可以正常工作了。
请记住,即使它 "looks like" 您认为您可能只是在输入内容,但从 JavaScript 解释器的角度来看,它在执行之前需要 "eval" 内容,它仍然"just a string"。因此,相同的规则适用于 JavaScript 插入 "string".