Windows 10 符文逃逸
Windows 10 runas escaping
这更多是理论构造,或者是一个有趣的问题,而不是现实世界的场景 - 在这种情况下,我会使用批处理文件来防止转义问题。
假设我们想要 运行 运行 以某种方式 Windows 10:
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 window 中的输出只是
%path%
这不是我们想要的(我们希望将 PATH 变量的值打印到控制台)。
假设我们想要一些其他的东西,我们需要在我们的命令中使用 ":
runas /user:John "cmd.exe /k dir c:\Program Files"
这不起作用 - 显然是因为程序和文件之间的 space,出现的新 shell window 说了两次 "File Not Found"。
人们希望解决这个问题的方法是
runas /user:John "cmd.exe /k dir ^"c:\Program Files^""
但这不起作用(运行打印使用帮助)。问题是为什么?
真正的解决方案是使用 \"
:
runas /user:John "cmd.exe /k dir \"c:\Program Files\""
这种转义可以在运行as usage help Examples部分看到。但这不是转义引号的常用方法,是吗?这里的问题 - 为什么 ^"
不起作用?
我们涉及三个实体:
- 外部
cmd
shell,您在其中键入 runas ...
runas.exe
,获取信用,启动新进程等
- 内部
cmd
shell,这就是runas
被告知要执行的
当您键入 runas ... "cmd.exe /k echo %path%"
- 外shell看到
%path%
并展开
runas
接受扩展命令,启动内部 shell 作为参数
- 内部 shell 呼应了它所看到的
当您键入 runas ... "cmd.exe /k echo ^%path^%"
- 外部 shell 在引号 中看到
^%path^%
,并将脱字符解释为转义百分号,因此它不会扩展 path
并将插入符留在原位
runas
将命令 运行 视为 cmd.exe /k echo %^path^%
- 内部 shell 看到
echo ^%path^%
而你在新 window. 看到 %path%
所以当插入符在引号内时,它们会被保留。但如果不使用引号,runas
将不起作用——该命令必须被视为单个参数。怎么办?
一种方法是使用批处理文件,如您所说。
另一种是使用不同的环境变量:
set aa=echo ^%path^%
runas /user:rpres "cmd.exe /k %aa%"
- 外部 shell 在
set
命令中看到插入符号 不在引号 中,并生成一个值为 echo %path%
[ 的变量=80=]
- 外层shell在
runas
行看到一个要展开的变量,展开。一次。内%path%
不展开
- 运行as 将命令视为
cmd.exe /k echo %path%
并且 运行 视为
- 内shell见
echo %path%
。它扩展了路径。您会在新 window. 中看到扩展路径
最后一种方法是在转义插入符之前去掉引号:runas.exe ... "cmd.exe /k echo "^%path^%
不过,重要的是没有不在引号中的空格!
- 外部 shell 在
runas
行上看到插入符 不在引号 中,并在删除插入符时转义百分号。
- 运行as 将命令视为
cmd.exe /k echo %path%
并且 运行 视为
- 内shell见
echo %path%
。它扩展了路径。您会在新 window. 中看到扩展路径
请注意,您可以在完成转义百分比后 "get back in the quotes"。例如runas /user:rpres "cmd.exe /k echo here is my path :::"^%path^%":::"
将显示 here is my path
后跟用三个冒号括起来的路径。
这更多是理论构造,或者是一个有趣的问题,而不是现实世界的场景 - 在这种情况下,我会使用批处理文件来防止转义问题。
假设我们想要 运行 运行 以某种方式 Windows 10:
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 window 中的输出只是
%path%
这不是我们想要的(我们希望将 PATH 变量的值打印到控制台)。
假设我们想要一些其他的东西,我们需要在我们的命令中使用 ":
runas /user:John "cmd.exe /k dir c:\Program Files"
这不起作用 - 显然是因为程序和文件之间的 space,出现的新 shell window 说了两次 "File Not Found"。
人们希望解决这个问题的方法是
runas /user:John "cmd.exe /k dir ^"c:\Program Files^""
但这不起作用(运行打印使用帮助)。问题是为什么?
真正的解决方案是使用
\"
:runas /user:John "cmd.exe /k dir \"c:\Program Files\""
这种转义可以在运行as usage help Examples部分看到。但这不是转义引号的常用方法,是吗?这里的问题 - 为什么
^"
不起作用?
我们涉及三个实体:
- 外部
cmd
shell,您在其中键入runas ...
runas.exe
,获取信用,启动新进程等- 内部
cmd
shell,这就是runas
被告知要执行的
当您键入 runas ... "cmd.exe /k echo %path%"
- 外shell看到
%path%
并展开 runas
接受扩展命令,启动内部 shell 作为参数- 内部 shell 呼应了它所看到的
当您键入 runas ... "cmd.exe /k echo ^%path^%"
- 外部 shell 在引号 中看到
^%path^%
,并将脱字符解释为转义百分号,因此它不会扩展path
并将插入符留在原位 runas
将命令 运行 视为cmd.exe /k echo %^path^%
- 内部 shell 看到
echo ^%path^%
而你在新 window. 看到
%path%
所以当插入符在引号内时,它们会被保留。但如果不使用引号,runas
将不起作用——该命令必须被视为单个参数。怎么办?
一种方法是使用批处理文件,如您所说。
另一种是使用不同的环境变量:
set aa=echo ^%path^%
runas /user:rpres "cmd.exe /k %aa%"
- 外部 shell 在
set
命令中看到插入符号 不在引号 中,并生成一个值为echo %path%
[ 的变量=80=] - 外层shell在
runas
行看到一个要展开的变量,展开。一次。内%path%
不展开 - 运行as 将命令视为
cmd.exe /k echo %path%
并且 运行 视为 - 内shell见
echo %path%
。它扩展了路径。您会在新 window. 中看到扩展路径
最后一种方法是在转义插入符之前去掉引号:runas.exe ... "cmd.exe /k echo "^%path^%
不过,重要的是没有不在引号中的空格!
- 外部 shell 在
runas
行上看到插入符 不在引号 中,并在删除插入符时转义百分号。 - 运行as 将命令视为
cmd.exe /k echo %path%
并且 运行 视为 - 内shell见
echo %path%
。它扩展了路径。您会在新 window. 中看到扩展路径
请注意,您可以在完成转义百分比后 "get back in the quotes"。例如runas /user:rpres "cmd.exe /k echo here is my path :::"^%path^%":::"
将显示 here is my path
后跟用三个冒号括起来的路径。