如何转义未知字符串并将其传递给本机命令
How to escape unknown string and pass it to native command
考虑以下示例(忽略安全隐患):
$pass = (Read-Host)
&net user testuser $pass /add
现在如果有人输入如下内容:
a1'"\'"\'"\
这行不通。我收到错误消息说这样的用户不存在。
我尝试使用 [Regex]::Escape()
,但它不起作用。我尝试将 $pass
放在双引号中,但它不起作用。我试过像这样使用 Start-Process
:
Start-Process -Wait net -ArgumentList @("user", "testuser", $pass, "/add")
但它不起作用。我尝试了 运行 net
命令而不使用前导符号,但它不起作用。
我读了大约。 Whosebug 上的 30 个问题在询问 "powershell escape command argument"(显示的 197 个中)后显示,但没有任何问题接近我需要的。也许我错过了什么,但是 197 个问题 很多。
编辑:
好的,所以我找到了这个:
https://github.com/PowerShell/PowerShell/issues/1995
如果不编写自定义函数并且不知道调用的是本机二进制文件还是 cmdlet 或其他东西,似乎几乎不可能正确地完成它。现在是说 "I don't even".
更合适的时刻
编辑 2:
对于这种情况(用户创建和正确引用密码),Ansgar Wiechers 提供了 link 展示了另一种创建本地用户帐户的方法,非常感谢。这并不意味着引用问题消失了,它只是意味着需要这种引用的情况少了一种。
注意:考虑到下面详述的围绕引用的挑战,请考虑 solving this problem differently,这最终可能会提供更大的灵活性和更好的安全性。
但是,了解 PowerShell 的一般引用挑战很重要,尤其是因为可能并不总是有调用外部程序的替代方法。
虽然没有必要,但不幸的是,PowerShell 需要手动转义嵌入的 "
字符。作为 \"
向外部程序传递参数时,这是 this GitHub issue.
中总结的一个长期存在的问题
# Sample password
$pass = @'
a1'"\'"\'"\
'@
#"# Escape all embedded " chars. as \"
net user testuser ($pass -replace '"', '\"') /add
至于你试过的:
I tried using [Regex]::Escape()
您正在尝试传递存储在变量中的密码逐字,因此正则表达式在这里不起作用。
I tried putting $pass in double quotes
这没有效果,因为 $pass
是一个字符串变量开头(字符串就是 Read-Host
returns)。
I tried using Start-Process
Start-Process
永远不是调用 console 应用程序 同步 的正确工具 - 请参阅 .
此外,Start-Process
有自己的引用挑战 - 请参阅 this GitHub issue。
考虑以下示例(忽略安全隐患):
$pass = (Read-Host)
&net user testuser $pass /add
现在如果有人输入如下内容:
a1'"\'"\'"\
这行不通。我收到错误消息说这样的用户不存在。
我尝试使用 [Regex]::Escape()
,但它不起作用。我尝试将 $pass
放在双引号中,但它不起作用。我试过像这样使用 Start-Process
:
Start-Process -Wait net -ArgumentList @("user", "testuser", $pass, "/add")
但它不起作用。我尝试了 运行 net
命令而不使用前导符号,但它不起作用。
我读了大约。 Whosebug 上的 30 个问题在询问 "powershell escape command argument"(显示的 197 个中)后显示,但没有任何问题接近我需要的。也许我错过了什么,但是 197 个问题 很多。
编辑:
好的,所以我找到了这个:
https://github.com/PowerShell/PowerShell/issues/1995
如果不编写自定义函数并且不知道调用的是本机二进制文件还是 cmdlet 或其他东西,似乎几乎不可能正确地完成它。现在是说 "I don't even".
更合适的时刻编辑 2: 对于这种情况(用户创建和正确引用密码),Ansgar Wiechers 提供了 link 展示了另一种创建本地用户帐户的方法,非常感谢。这并不意味着引用问题消失了,它只是意味着需要这种引用的情况少了一种。
注意:考虑到下面详述的围绕引用的挑战,请考虑 solving this problem differently,这最终可能会提供更大的灵活性和更好的安全性。
但是,了解 PowerShell 的一般引用挑战很重要,尤其是因为可能并不总是有调用外部程序的替代方法。
虽然没有必要,但不幸的是,PowerShell 需要手动转义嵌入的 "
字符。作为 \"
向外部程序传递参数时,这是 this GitHub issue.
# Sample password
$pass = @'
a1'"\'"\'"\
'@
#"# Escape all embedded " chars. as \"
net user testuser ($pass -replace '"', '\"') /add
至于你试过的:
I tried using
[Regex]::Escape()
您正在尝试传递存储在变量中的密码逐字,因此正则表达式在这里不起作用。
I tried putting $pass in double quotes
这没有效果,因为 $pass
是一个字符串变量开头(字符串就是 Read-Host
returns)。
I tried using
Start-Process
Start-Process
永远不是调用 console 应用程序 同步 的正确工具 - 请参阅 .
此外,Start-Process
有自己的引用挑战 - 请参阅 this GitHub issue。