处理带空格的名称
Handling names with spaces
我的 Puppet 代理是 Windows Server 2012。我正在尝试向 AD 用户授予 g运行t 数据库权限。如果我尝试将权限分配给名称中不包含任何 space 的 AD 用户,则脚本可以正常工作。早些时候,没有 space 的用户名也不起作用,但是当我添加一个额外的斜杠 ('abc\s_sql'
) 时,它对那个用户有效。对于带有 space 的用户名,尽管 Puppet 显示它 运行 成功,但它 根本不起作用 。
[root@pe-server] cat grant_read.pp
define db::grant_read (
$grant_read_params
) {
$grant_read_ps = $grant_read_params[grant_read_ps]
$grant_read_sql = $grant_read_params[grant_read_sql]
$read_user = $grant_read_params[read_user]
$db_name = $grant_read_params[db_name]
utils::powershell_script { "Grant read access to user $read_user on $db_name":
script => $grant_read_ps,
parameter => "$grant_read_sql $read_user $db_name",
}
}
[root@pe-server] cat site.pp
node 'pe-agent.abc.com' {
$grant_read_params_Support_PROD = {
'grant_read_ps' => 'c:/db/grant_read.ps1',
'grant_read_sql' => 'c:/db/grant_read.sql',
#'read_user' => 'abc\s_sql',
'read_user' => 'abc\APP Support_PROD',
'db_name' => 'ABC_MASTER',
}
db::grant_read { "Granting read access to tom on some db":
grant_read_params => $grant_read_params_Support_PROD
}
}
[root@pe-server] cat powershell_script.pp
define utils::powershell_script (String $script, String $parameter = '') {
$powershell = 'C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -NoProfile -NoLogo -NonInteractive'
exec { "Running $script on agent with parameter $parameter":
command => "$powershell -File $script $parameter",
logoutput => 'on_failure',
timeout => 900,
}
}
在 site.pp 文件参数和 grant_read.pp 文件中尝试了几种排列和组合,但似乎没有任何效果。
知道我该如何处理吗?
您需要用双引号将带空格的参数括起来。单引号在这里不起作用,因为它们在执行 PowerShell 命令行的 Windows 环境中不是有效的引号字符。由于您不能使用单引号字符串(以免 Puppet 不会扩展变量),因此您必须使用反斜杠转义嵌套的双引号(对于 Puppet)。
基本上,这个:
"$grant_read_sql \"$read_user\" $db_name"
变成这样的字符串:
'c:/db/grant_read.sql "abc\APP Support_PROD" ABC_MASTER'
最后,当插入到 PowerShell 命令行时,如下所示:
C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -NoProfile -NoLogo -NonInteractive -File c:/db/grant_read.ps1 c:/db/grant_read.sql "abc\APP Support_PROD" ABC_MASTER
完全扩展的命令行(见上文)的形式必须允许 运行 直接从 CMD 或 运行 对话框。这意味着如果任何其他标记(例如脚本路径)中有空格,则该标记也需要用双引号引起来。
底线:执行 Windows 命令行时,您需要在参数周围加上双引号,并在 Puppet 的双引号字符串中使用反斜杠转义嵌套双引号。
我的 Puppet 代理是 Windows Server 2012。我正在尝试向 AD 用户授予 g运行t 数据库权限。如果我尝试将权限分配给名称中不包含任何 space 的 AD 用户,则脚本可以正常工作。早些时候,没有 space 的用户名也不起作用,但是当我添加一个额外的斜杠 ('abc\s_sql'
) 时,它对那个用户有效。对于带有 space 的用户名,尽管 Puppet 显示它 运行 成功,但它 根本不起作用 。
[root@pe-server] cat grant_read.pp
define db::grant_read (
$grant_read_params
) {
$grant_read_ps = $grant_read_params[grant_read_ps]
$grant_read_sql = $grant_read_params[grant_read_sql]
$read_user = $grant_read_params[read_user]
$db_name = $grant_read_params[db_name]
utils::powershell_script { "Grant read access to user $read_user on $db_name":
script => $grant_read_ps,
parameter => "$grant_read_sql $read_user $db_name",
}
}
[root@pe-server] cat site.pp
node 'pe-agent.abc.com' {
$grant_read_params_Support_PROD = {
'grant_read_ps' => 'c:/db/grant_read.ps1',
'grant_read_sql' => 'c:/db/grant_read.sql',
#'read_user' => 'abc\s_sql',
'read_user' => 'abc\APP Support_PROD',
'db_name' => 'ABC_MASTER',
}
db::grant_read { "Granting read access to tom on some db":
grant_read_params => $grant_read_params_Support_PROD
}
}
[root@pe-server] cat powershell_script.pp
define utils::powershell_script (String $script, String $parameter = '') {
$powershell = 'C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -NoProfile -NoLogo -NonInteractive'
exec { "Running $script on agent with parameter $parameter":
command => "$powershell -File $script $parameter",
logoutput => 'on_failure',
timeout => 900,
}
}
在 site.pp 文件参数和 grant_read.pp 文件中尝试了几种排列和组合,但似乎没有任何效果。
知道我该如何处理吗?
您需要用双引号将带空格的参数括起来。单引号在这里不起作用,因为它们在执行 PowerShell 命令行的 Windows 环境中不是有效的引号字符。由于您不能使用单引号字符串(以免 Puppet 不会扩展变量),因此您必须使用反斜杠转义嵌套的双引号(对于 Puppet)。
基本上,这个:
"$grant_read_sql \"$read_user\" $db_name"
变成这样的字符串:
'c:/db/grant_read.sql "abc\APP Support_PROD" ABC_MASTER'
最后,当插入到 PowerShell 命令行时,如下所示:
C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -NoProfile -NoLogo -NonInteractive -File c:/db/grant_read.ps1 c:/db/grant_read.sql "abc\APP Support_PROD" ABC_MASTER
完全扩展的命令行(见上文)的形式必须允许 运行 直接从 CMD 或 运行 对话框。这意味着如果任何其他标记(例如脚本路径)中有空格,则该标记也需要用双引号引起来。
底线:执行 Windows 命令行时,您需要在参数周围加上双引号,并在 Puppet 的双引号字符串中使用反斜杠转义嵌套双引号。