cmd - Windows 10 runas 转义

标签 cmd escaping windows-10 runas

这更多的是理论构造,或者是一个有趣的问题,而不是现实世界的场景 - 在这种情况下,我将使用批处理文件来防止逃逸问题。

  1. 假设我们想以某种方式在 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 变量的值打印到控制台)。

  2. 假设我们想要一些其他东西,并且需要在命令中使用“:

    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/

相关文章:

batch-file - 批处理脚本中的 FTP 命令无法正常工作

java - 如何在 Windows 上使用单个命令执行 .jar 文件?

java - 命令提示符中不存在包

java - 如何在 strings.xml 中输入字符 "<"?

windows - 有什么方法可以从 Windows 10 中的 c# 桌面应用程序使用蓝牙 LE?

c# - SQLite Windows 10 RTM 通用应用程序

api - Heroku:http-error 410。来自 API 的无效响应(我不在代理后面)

javascript - 将转义字符视为单个字符,查找字符串中的字符数

php - 如何只转义单引号?

.net - 无法在 Windows 10 上安装 Windows SDK 7.1