透過遵循好的(儘管有時是相互矛盾的)建議,例如
引號、轉義字元、分隔符號 - Windows CMD - SS64.com或者
轉義字元 – 維基百科,第 2.6 節 Windows_Command_Prompt甚至
Windows NT 命令外殼,我解決了99%左右的越獄問題,但最後一點還在掙扎。我的用例是將用於解密或加密 pdf 檔案的密碼參數指定為 的命令列參數qpdf.exe
,因此歡迎使用特殊字元。如果可能的話,我希望能夠使用更多或更少全部可列印字符,其中 SPACE (U+0020) 作為唯一的空白字符。
沒有額外的間接級別,例如在命令之間傳遞參數或調用批次檔;我需要產生的只是 Windows 命令列的「直接」命令。
這是我到目前為止所取得的進展:
- 與上面 SS64.com 連結中提到的相反,
COMMA
(U+002C)、SEMICOLON
(U+003B) 和EQUAL SIGN
(U+003D) 沒有問題(至少對於我的用例而言) - 只是將所有內容放入
QUOTATION MARKS
(U+0022),同時加倍預先存在的QUOTATION MARKS
(U+0022),並不能正常工作,因為它至少會給PERCENT SIGN
(U+0025)留下問題。 - 此外,單獨的脫字符轉義並不能涵蓋所有內容。需要混合使用這些方法
到目前為止,這就是我的做法:
- 僅「本地」雙引號任何內容
QUOTATION MARK
,即將任何 U+0022 替換為 U+0022 U+0022 U+0022 U+0022 - 僅「本地」引用任何內容
SPACE
,即將 U+0020 替換為 U+0022 U+0020 U+0022 - Caret-轉義插入符本身,即以 U+005E U+005E 取代 U+005E
- 插入符轉義剩餘的特殊字元(如連結文章中所列的),即 for
x
inLESS-THAN SIGN
(U+003C)、GREATER-THAN SIGN
(U+003E)、AMPERSAND
(U+0026)、VERTICAL LINE
(U+007C)、LEFT PARENTHESIS
(U+0028) 、RIGHT PARENTHESIS
( U+0029),將任何出現的 替換x
為 U+005Ex
。 - 另外,似乎有必要對插入符進行轉義
PERCENT SIGN
,將每個 U+0025 替換為 U+005E U+0025
因此要指定一個密碼,例如Hello %TEMP%>"&abc
,我最終會得到
C:\path\to\qpdf.exe --encrypt Hello" "^%TEMP^%^>""""^&abc someownerpassword 256 -- input.pdf output.pdf
這工作正常,即打開output.pdf時我需要在密碼對話框視窗中輸入的密碼確實是Hello %TEMP%>"&abc
只有一個(到目前為止)邪惡角色無法阻止我所有逃離它的嘗試:ASTERISK
(U+0042)!引用、重複、脫字符轉義(或我隨機嘗試的其他轉義字符)都不適用於它——它總是會嘗試“通配符”。在某些情況下,如果沒有文件與全局匹配,人們可能會很幸運,但我絕對需要問...
問題。我如何轉義所需的密碼,例如*.*
(U+0042 U+002E U+0042) 並防止它通配?