这更多的是理论构造,或者是一个有趣的问题,而不是现实世界的场景 - 在这种情况下,我将使用批处理文件来防止逃逸问题。
假设我们想以某种方式在 Windows 10 上运行 runas:
runas /user:John "cmd.exe /k echo %path%"
这不起作用,因为 %path% 已扩展并且我们收到错误:
正在尝试启动 cmd.exe/k echo C:\Program Files (x... ... RUNAS 错误:无法运行 - cmd.exe/k ech... ... 1734: 数组边界无效。
这个问题可以解决吗? IE。如何逃脱%? 如果我们尝试
runas /user:John "cmd.exe /k echo ^%path^%"
新 shell 窗口中的输出只是
%path%
这不是我们想要的(我们希望将 PATH 变量的值打印到控制台)。
假设我们想要一些其他东西,并且需要在命令中使用“:
runas /user:John "cmd.exe /k dir c:\Program Files"
这不起作用 - 显然是因为程序和文件之间存在空格,出现的新 shell 窗口显示两次“找不到文件”。
人们期望这个问题的解决方案是
runas /user:John "cmd.exe /k dir ^"c:\Program Files^""
但这不起作用(runas 打印使用帮助)。问题是为什么?
这里真正的解决方案是使用
\"
:runas /user:John "cmd.exe /k dir \"c:\Program Files\""
这种转义可以在 runas 使用帮助示例部分中看到。但这不是转义引号的常见方法,不是吗?这里的问题是 - 为什么
^"
不起作用?
最佳答案
我们涉及三个实体:
- 外部
cmd
shell,您在其中输入runas ...
-
runas.exe
,获取信用,启动新流程等。 - 内在
cmd
shell,这是什么runas
被告知执行
当您输入runas ... "cmd.exe /k echo %path%"
时
- 外壳见
%path%
并扩展它 -
runas
接受扩展的命令,用它作为参数启动内壳 - 内壳与所见相呼应
当您输入runas ... "cmd.exe /k echo ^%path^%"
时
- 外壳见
^%path^%
在引号中,并将插入符号解释为转义百分号,因此它不会扩展path
并将插入符留在原处 -
runas
看到要运行的命令为cmd.exe /k echo %^path^%
- 内壳见
echo ^%path^%
你看到%path%
在新窗口中。
因此,当插入符号位于引号内时,它们将被保留。但如果不使用引号,runas
不起作用——该命令必须被视为单个参数。该怎么办?
一种方法是使用批处理文件,就像您所说的。
另一种方法是使用不同的环境变量:
set aa=echo ^%path^%
runas /user:rpres "cmd.exe /k %aa%"
- 外壳在
set
中看到插入符号不在引号中命令,并生成一个值为echo %path%
的变量 - 外壳看到一个要在
runas
上展开的变量线,并将其展开。一次。内在%path%
未展开 - runas 将该命令视为
cmd.exe /k echo %path%
和runas - 内壳见
echo %path%
。它扩展了路径。您会在新窗口中看到展开的路径。
最后一种方法是在转义插入符号之前先退出引号:runas.exe ... "cmd.exe /k echo "^%path^%
不过,重要的是不要有不在引号中的空格!
- 外壳在
runas
上看到插入符号不在引号中行,并在删除插入符号时转义百分号。 - runas 将该命令视为
cmd.exe /k echo %path%
和runas - 内壳见
echo %path%
。它扩展了路径。您会在新窗口中看到展开的路径。
请注意,完成转义百分比后,您可以“返回引号”。例如runas /user:rpres "cmd.exe /k echo here is my path :::"^%path^%":::"
将显示here is my path
后面跟着三个冒号括起来的路径。
关于cmd - Windows 10 runas 转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35390865/