배치 스크립트에서 이중 인용문을 피합니다
-
05-09-2019 - |
문제
배치 파일의 매개 변수의 이중 인용문을 모두 이중 인용문으로 대체하는 방법은 무엇입니까? 이것은 내 현재 배치 파일로 문자열 내부의 모든 명령 줄 매개 변수를 확장합니다.
@echo off
call bash --verbose -c "g++-linux-4.1 %*"
그런 다음 해당 문자열을 사용하여 Cygwin의 Bash를 호출하여 Linux 크로스 컴파일러를 실행합니다. 불행히도, 나는 배치 파일에 전달 된 매개 변수를 얻고 있습니다.
"launch-linux-g++.bat" -ftemplate-depth-128 -O3 -finline-functions
-Wno-inline -Wall -DNDEBUG -c
-o "C:\Users\Me\Documents\Testing\SparseLib\bin\Win32\LinuxRelease\hello.o"
"c:\Users\Me\Documents\Testing\SparseLib\SparseLib\hello.cpp"
첫 번째 경로 주변의 첫 번째 인용문은 조기에 문자열을 GCC로 전달하고 나머지 매개 변수를 BASH로 직접 전달합니다 (이는 화려하게 실패합니다.)
매개 변수를 단일 문자열로 연결할 수 있다면 인용문을 피할 수 있다면 잘 작동해야하지만이를 수행하는 방법을 결정하는 데 어려움이 있습니다. 아는 사람 있나요?
해결책 3
Google은 결국 답변을 생각해 냈습니다. 배치의 문자열 교체에 대한 구문은 다음과 같습니다.
set v_myvar=replace me
set v_myvar=%v_myvar:ace=icate%
"Me"를 생산합니다. 내 스크립트는 이제 다음과 같습니다.
@echo off
set v_params=%*
set v_params=%v_params:"=\"%
call bash -c "g++-linux-4.1 %v_params%"
모든 인스턴스를 대체합니다 "
~와 함께 \"
, Bash를 위해 제대로 탈출했습니다.
다른 팁
배치 스크립트의 탈출 문자는 다음과 같습니다 ^
. 그러나 이중 인용 문자열의 경우 인용문을 두 배로 늘리십시오.
"string with an embedded "" character"
Eplawless 자신의 답변 간단하고 효과적으로 그의 특정 문제를 해결합니다. "
전체 인수 목록의 인스턴스 \"
, 이것은 배쉬가 이중 인용 문자열 내부에 이중 인용물을 요구하는 방식입니다.
일반적으로 질문에 대답합니다 이중 인용 문자열 내에서 이중 인용을 피하는 방법을 사용합니다 cmd.exe
, Windows Command -line 통역사 (명령 줄 - 종종 여전히 실수로 "DOS 프롬프트"라고 부르거나 배치 파일) :보려면 바닥을 참조하십시오 PowerShell.
tl; dr:
너 ~ 해야 하다 사용
""
문자열을 통과 할 때 다른 사람에게) 배치 파일 당신은요 5월 사용""
응용 프로그램이 생성되었습니다 마이크로 소프트S C/C ++/. NET 컴파일러 (어느 또한 동의하기\"
), Windows에서 Python 및 Node.js를 포함합니다:예시:
foo.bat "We had 3"" of rain."
다음은 배치 파일에만 적용됩니다.
""
명령 통역사를 얻는 유일한 방법입니다 (cmd.exe
) 전체 이중 인용 문자열을 a로 취급합니다 하나의 논쟁.그러나 안타깝게도, 둘러싸는 이중 인용물은 (평소와 같이) 유지 될뿐만 아니라 두 배의 탈출 된 것도 유지되므로 의도 된 문자열을 얻는 것은 2 단계 프로세스입니다. 예를 들어, 이중 인용 문자열이 첫 번째 인수로 전달된다고 가정하면
%1
:set "str=%~1"
둘러싸는 이중 인용문을 제거합니다.set "str=%str:""="%"
그런 다음 두 배의 이중 점수를 단일로 변환합니다.
할당 부분 주위에 둘러싸는 이중 인용물을 사용하여 값의 원치 않는 해석을 방지하십시오.
\"
~이다 필수의 - 유일한 옵션 - 다른 많은 프로그램에서, (예 : Ruby, Perl, 심지어 Microsoft의 PowerShell (!)), 그러나 그것의 사용은 안전하지 않습니다:\"
많은 실행 파일과 통역사입니다 필요하다 -Strings를 통과 할 때 Microsoft 자체 PowerShell을 포함하여 바깥으로부터 - 또는 경우 Microsoft의 컴파일러, 지원 대안으로""
- 그러나 궁극적으로 인수 목록을 구문 분석하는 것은 대상 프로그램에 달려 있습니다.- 예시:
foo.exe "We had 3\" of rain."
- 예시:
- 그러나 사용
\"
원치 않는 임의의 명령 실행 및/또는 입력/출력 리디렉션을 초래할 수 있습니다.:- 다음 문자는이 위험을 제시합니다.
& | < >
- 예를 들어, 다음은 의도하지 않은 실행 결과
ver
명령; 설명 및 해결 방법에 대한 설명과 다음 총알 포인트는 아래를 참조하십시오.foo.exe "3\" of snow" "& ver."
- 다음 문자는이 위험을 제시합니다.
- 을 위한 PowerShell ~에 창,
\""
그리고"^""
강력하지만 제한된 대안입니다 (아래의 PowerShell의 CLI ... "섹션을 참조하십시오).
사용해야하는 경우
\"
, 3 만 있습니다 안전한 구혼, 그러나, 그것은 그것이 있습니다 꽤 번거 롭습니다: 모자 끝 TS 그의 도움으로.사용 (아마도 선택적) 지연된 가변 확장 배치 파일에서 가능합니다 문자 그대로
\"
안에 변하기 쉬운 그리고 a 내부의 변수를 참조하십시오"..."
문자열 사용!var!
통사론 - 보다 TS의 유용한 답변.- 위의 접근 방식은 번거 롭지 만 적용 할 수있는 이점이 있습니다. 체계적으로 그리고 그것이 작동합니다 견고하게, 모든 입력으로.
문자 그 줄로 만 - 변수가 포함되지 않은 문자열 - 비슷한 체계적인 접근 방식을 얻습니까?
^
-탈출하다 모두cmd.exe
Metacharacters :" & | < >
그리고 - 가변 확장을 억제하려면 -%
:
foo.exe ^"3\^" of snow^" ^"^& ver.^"
그렇지 않으면, 당신은해야합니다 문자열의 일부 부분을 인식하여 문자열을 공식화하십시오.
cmd.exe
고려합니다 인용되지 않았습니다 오해로 인해\"
구분 구동자를 닫는대로 :안에 정확한 쉘 metacharacters를 포함하는 부분 :
^
-그들을 향해; 위의 예제를 사용합니다&
그게되어야합니다^
-에스코 드 :
foo.exe "3\" of snow" "^& ver."
부분에서 ~와 함께
%...%
-스타일 변수 참조: 그것을 확인하십시오cmd.exe
그들을 a의 일부로 간주합니다"..."
끈 그리고 가변 값 자체가 내장 된 불균형 인용문이 아닙니다. 항상 가능하지는 않습니다.
배경 정보는 계속 읽으십시오.
배경
참고 : 이것은 내 자신의 실험을 기반으로합니다. 내가 틀렸다면 알려주세요.
Bash On과 같은 Posix와 같은 쉘 유닉스와 같은 시스템 인수를 전달하기 전에 인수 목록 (문자열)을 토큰 화하십시오. 개별적으로 대상 프로그램 : 다른 확장 중에서도 인수 목록을 개별 단어 (단어 분할)로 나누고 결과 단어에서 인용 문자를 제거합니다 (인용 제거). 대상 프로그램은 다음과 같습니다 정렬 의 개별 주장, 와 함께 구문 따옴표가 제거되었습니다.
대조적으로, Windows Command Interperter는 분명히 인수 목록을 토큰 화하지 않고 간단히 전달합니다. 하나의 구성된 문자열 모두 인용 숯을 포함한 인수. - 대상 프로그램에.
하지만, 약간 단일 문자열이 대상 프로그램으로 전달되기 전에 전처리가 발생합니다. ^
탈출 숯. 이중 크기의 문자열 외에는 제거됩니다 (다음 숯을 피하십시오.) 및 가변 참조 (예 : %USERNAME%
) 이다 보간 첫 번째.
따라서 UNIX와 달리 인수 문자열을 구문 분석하고 인용문을 제거한 개별 인수로 분류하는 것은 대상 프로그램의 책임입니다. 따라서, 다른 프로그램은 상이한 탈출 방법을 가설 적으로 요구할 수 있습니다 그리고 단일 탈출 메커니즘은 없습니다 보장 모든 프로그램과 함께 일합니다 - https://stackoverflow.com/a/4094897/45375 Windows Command-Line Parsing 인 무정부 상태에 대한 우수한 배경이 포함되어 있습니다.
실제로, \"
매우 일반적이지만 안전하지는 않습니다, 앞에서 말했다시피:
부터 cmd.exe
그 자체는 인식하지 못합니다 \"
로서 탈출 두 배의 인용문, 그것은 명령 줄에서 나중에 토큰을 잘못 구축 할 수 있습니다. 인용되지 않았습니다 잠재적으로 그것들을 다음으로 해석합니다 명령 및/또는 입력/출력 리디렉션.
간단히 말해서 : 문제 표면, 다음 문자 중 하나가 개방 또는 불균형 \"
: & | < >
; 예를 들어:
foo.exe "3\" of snow" "& ver."
cmd.exe
오해로 인한 다음 토큰을 봅니다 \"
정기적 인 이중 쿼트 :
"3\"
of
snow" "
- 쉬다:
& ver.
부터 cmd.exe
그것을 생각합니다 & ver.
~이다 인용되지 않았습니다, 그것은 그것을 다음으로 해석합니다 &
(명령-시퀀싱 연산자), 실행 할 명령의 이름이 뒤 따릅니다 (ver.
- .
무시됩니다. ver
보고서 cmd.exe
의 버전 정보).
전반적인 효과는 다음과 같습니다.
- 첫 번째,
foo.exe
첫 번째로 호출됩니다 3 토큰 만. - 그런 다음 명령
ver
실행됩니다.
우연한 명령이 해를 끼치 지 않는 경우에도 모든 인수가 전달되는 것은 아니기 때문에 전체 명령이 설계된대로 작동하지 않습니다.
많은 컴파일러 / 통역사는 만 인식합니다 \"
- 예 : GNU C/C ++ 컴파일러, Python, Perl, Ruby, 심지어 Microsoft의 PowerShell에서 호출했을 때 cmd.exe
- 그리고 PowerShell을 제외하고 \""
, 그들을 위해 이 문제에 대한 간단한 해결책은 없습니다.
본질적으로, 당신은 명령 줄의 일부가 인용되지 않은 것으로 잘못 해석되고 선택적으로 어떤지 미리 알아야합니다. ^
-모든 인스턴스를 향상시킵니다 & | < >
그 부분에서.
대조적으로 사용 ""
는 안전하다, 하지만 유감스럽게도 Microsoft-Compiler 기반 실행 파일 및 배치 파일에서만 지원됩니다 (위에서 논의 된 단점이있는 배치 파일의 경우), 주목할만한 것은 PowerShell - 다음 섹션을 참조하십시오.
PowerShell의 CLI를 호출합니다 cmd.exe
또는 posix와 같은 쉘 :
참고 : 인용 처리 방법은 하단 섹션을 참조하십시오. 내부에 PowerShell.
PowerShell, 호출되면 바깥으로부터 - 예를 들어, cmd.exe
, 명령 줄이나 배치 파일에서 인식합니다 뿐 \"
그리고 창문에서도 """
그리고 더 강력한 \""
/ "^""
(일지라도 내부적 PowerShell 사용 `
두 배로 인용 된 문자열의 탈출 문자로서 ""
- 하단 섹션 참조) :
에 창, 전화 ~에서 cmd.exe
/ 배치 파일 :
""
깨진, 그것은 근본적으로 지원되지 않기 때문에 :powershell -c " ""ab c"".length "
-> 오류 "문자열이 터미네이터가 없다"
\"
그리고"""
일하다 원칙적으로, 그러나 그렇지 않습니다 안전한:powershell -c " \"ab c\".length "
의도 한대로 작동합니다 : 출력5
(참고 2 공간)- 그러나 안전하지 않습니다
cmd.exe
Metacharacters는 탈출하지 않는 한 명령을 위반합니다.
powershell -c " \"a& c\".length "
깨진, 인해&
, 그것은 탈출해야합니다^&
\""
~이다 안전한, 하지만 내부 공백을 정규화합니다, 원하지 않을 수 있습니다.powershell -c " \""a& c\"".length "
출력4
(!), 2 개의 공간이 1로 정규화되기 때문에.
"^""
최선의 선택입니다 Windows PowerShell 구체적으로, 안전하고 공백 보존이지만 PowerShell과 함께 핵심 (창에서)와 동일합니다\""
, 즉, 공백-정규화. 크레딧이 간다 venryx 이 접근법을 발견했습니다.powershell -c " "^""a& c"^"".length "
공장: 깨지지 않습니다 -에도 불구하고&
- 그리고 출력5
, 즉, 정확하게 보존 된 공백.PowerShell 핵심:
pwsh -c " "^""a& c"^"".length "
공장, 그러나 출력4
, 즉 공백을 정규화합니다, 처럼\""
하다.
에 유닉스와 같은 플랫폼 (Linux, MacOS), 전화 PowerShell 핵심Cli, pwsh
Posix와 같은 쉘에서 bash
:
너 ~ 해야 하다 사용 \"
, 그러나, 어느 것입니다 안전하고 공백 보존:
$ pwsh -c " \"a& c|\".length" # OK: 5
관련 정보
^
탈출 문자로만 사용할 수 있습니다 인용되지 않았습니다 문자열 - 이중 인용 문자열 내부,^
특별하지 않으며 문자 그대로 취급됩니다.- 경고: 사용
^
매개 변수에서call
진술이 깨졌습니다 (이것은 두 가지 용도에 적용됩니다call
: 다른 배치 파일 또는 이진을 호출하고 동일한 배치 파일에서 서브 루틴을 호출) :^
인스턴스 이중 인용 값은 설명 할 수 없을 정도로 두 배가되었습니다, 전달되는 값 변경 : 예 : 변수 인 경우%v%
문자 적 가치를 포함합니다a^b
,call :foo "%v%"
할당"a^^b"
(!) 에게%1
서브 루틴의 (첫 번째 매개 변수):foo
.- 인용되지 않았습니다 사용
^
~와 함께call
~이다 완전히 깨졌습니다 그것에^
더 이상 특수 캐릭터를 탈출하는 데 사용할 수 없습니다: 예,call foo.cmd a^&b
조용히 부서집니다 (문자 그대로 지나가는 대신a&b
~도foo.cmd
, 그렇지 않은 경우와 마찬가지로call
) -foo.cmd
적어도 Windows 7에서는 (!)조차 호출되지 않습니다.
- 경고: 사용
문자를 탈출합니다
%
특별한 경우입니다, 불행히도 문자열이 명령 줄 vs. 배치 파일 내부; 보다 https://stackoverflow.com/a/31420292/45375- 부족 : 배치 파일 내부에서 사용
%%
. 명령 줄에서%
탈출 할 수는 없지만 a^
시작, 끝 또는 내부의 변수 이름에 인용되지 않았습니다 문자열 (예 :echo %^foo%
), 가변 확장 (보간)을 방지 할 수 있습니다.%
변수 참조의 일부가 아닌 명령 줄의 인스턴스는 리터럴로 취급됩니다 (예 :100%
).
- 부족 : 배치 파일 내부에서 사용
일반적으로, 공백과 특수 문자를 포함 할 수있는 가변 값으로 안전하게 작업하려면:
- 과제: 넣다 둘 다 변수 이름과 값의 값 하나의 두 배의 쌍; 예,
set "v=a & b"
문자 그대로의 가치를 지정합니다a & b
변수로%v%
(대조적으로set v="a & b"
값의 이중 인용물을 일부로 만듭니다). 탈출 문자%
인스턴스로%%
(배치 파일에서만 작동 - 위 참조). - 참조: 이중 인용 변수 참조 그들의 가치가 보간되지 않도록하기 위해; 예,
echo "%v%"
가치를 적용하지 않습니다%v%
보간 및 인쇄에"a & b"
(그러나 이중 인용물은 항상 인쇄됩니다). 대조적으로echo %v%
문자를 통과합니다a
에게echo
, 해석&
명령-시퀀싱 연산자로서b
.
또한 위의 경고를 다시 사용하십시오^
이랑call
성명. - 외부 프로그램은 일반적으로 매개 변수 주위의 이중 인용물을 제거하는 것을 관리하지만, 배치 파일에서는 직접 수행해야합니다 (예 :
%~1
첫 번째 매개 변수에서 이중 상품을 둘러싸는 것을 제거하려면 슬프게도 내가 얻는 직접적인 방법은 없습니다.echo
가변 가치를 충실하게 인쇄합니다 없이 둘러싸는 이중 크기.- 닐 제안 ㅏ
for
-작동하는 해결 방법 값에 이중 따옴표가 포함되지 않은 한; 예 :
set "var=^&')|;,%!" for /f "delims=" %%v in ("%var%") do echo %%~v
- 닐 제안 ㅏ
- 과제: 넣다 둘 다 변수 이름과 값의 값 하나의 두 배의 쌍; 예,
cmd.exe
하다 ~ 아니다 인정하다 하나의-인용 부호 문자열 구분자로서 - 그들은 리터럴로 취급되며 일반적으로 공백이 내장 된 현악기를 구분하는 데 사용될 수 없습니다. 또한 단일 크기와 그 사이의 토큰에 인접한 토큰이 인용되지 않은 것으로 취급됩니다.cmd.exe
그에 따라 해석되었습니다.- 그러나 대상 프로그램이 궁극적으로 자체 논증 구문 분석을 수행한다는 점을 감안할 때 Ruby와 같은 일부 프로그램은 Windows에서도 단일 인용 문자열을 인식합니다. 대조적으로 C/C ++ 실행 파일, Perl 및 Python DO ~ 아니다 그들을 인식하십시오.
그러나 대상 프로그램에 의해 지원 되더라도 내용물이 잠재적으로 원치 않는 해석으로부터 보호되지 않기 때문에 단일 인용 문자열을 사용하는 것이 좋지 않습니다.cmd.exe
.
- 그러나 대상 프로그램이 궁극적으로 자체 논증 구문 분석을 수행한다는 점을 감안할 때 Ruby와 같은 일부 프로그램은 Windows에서도 단일 인용 문자열을 인식합니다. 대조적으로 C/C ++ 실행 파일, Perl 및 Python DO ~ 아니다 그들을 인식하십시오.
인용 이내에 PowerShell :
Windows PowerShell 보다 훨씬 더 고급 쉘입니다 cmd.exe
, 그리고 그것은 몇 년 동안 Windows의 일부였습니다 (그리고 지금은 PowerShell Core PowerShell 경험을 MacOS와 Linux에도 가져 왔습니다).
PowerShell은 일관되게 작동합니다 내부적 인용과 관련하여 :
- 이중 인용 문자열 내부, 사용
`"
또는""
이중 인출을 피하기 위해 - 단일 크기의 문자열 내부, 사용
''
단일 크기를 피하기 위해
이것은 PowerShell 명령 줄에서 작동하고 파라미터를 PowerShell 스크립트 또는 함수로 전달할 때 이내에 PowerShell.
(위에서 논의한 바와 같이, 탈출 한 이중 쿼트를 PowerShell에게 전달 바깥으로부터 필요합니다 \"
또는 더 견고하게 \""
- 다른 것이 작동하지 않습니다).
슬프게도, 호출 할 때 외부 PowerShell의 프로그램, PowerShell 자신의 인용 규칙을 수용해야 할 필요성에 직면 해 있습니다. 그리고 탈출하기 위해 표적 프로그램:
이 문제가있는 행동은 또한 논의되고 요약됩니다 이 github 문서 문제
더블-내부에 인용됩니다 더블-인용 된 문자열:
문자열을 고려하십시오 "3`" of rain"
, 내기적으로 파워 hell은 문자로 번역됩니다 3" of rain
.
이 문자열을 외부 프로그램으로 전달하려면 대상 프로그램의 탈출을 적용해야합니다 게다가 PowerShell 's에; 문자열을 C 프로그램으로 전달하고 싶다고 가정 해 \"
:
foo.exe "3\`" of rain"
방법에 주목하십시오 둘 다 `"
- PowerShell을 행복하게 만들기 위해 - 그리고 그만큼 \
- 목표 프로그램을 행복하게하려면 - 존재해야합니다.
배치 파일을 호출하는 데 동일한 논리가 적용됩니다. ""
사용해야합니다.
foo.bat "3`"`" of rain"
대조적으로, 임베딩 하나의-a 더블-인용 된 문자열 탈출 할 필요가 없습니다.
하나의-내부에 인용됩니다 하나의-인용 된 문자열 하다 ~ 아니다 필요하다 추가의 탈출; 고려하다 '2'' of snow'
, 그것은 PowerShell의 표현입니다 2' of snow
.
foo.exe '2'' of snow'
foo.bat '2'' of snow'
PowerShell은 단일 크기의 문자열을 대상 프로그램에 전달하기 전에 두 배로 인용 된 문자열로 번역합니다.
하지만, 더블-내부에 인용됩니다 하나의-인용 된 문자열, 탈출 할 필요가 없습니다 PowerShell, 여전히 탈출해야합니다 대상 프로그램:
foo.exe '3\" of rain'
foo.bat '3"" of rain'
PowerShell v3 마법을 소개했습니다 --%
옵션, 정지판 기호, 그 이후에 아무것도 통과함으로써 약간의 고통을 완화시킵니다. 해석되지 않았습니다 대상 프로그램에 저장하십시오 cmd.exe
-스타일 환경-변수 참조 (예 : %USERNAME%
), 어느 ~이다 퍼지는; 예 :
foo.exe --% "3\" of rain" -u %USERNAME%
내장을 탈출하는 방법에 유의하십시오 "
~처럼 \"
대상 프로그램 만 (PowerShell에게도 \`"
) 충분하다.
그러나이 접근법 :
- 허용하지 않습니다 탈출
%
환경 변수 확장을 피하기 위해 문자. - 배제합니다 직접 PowerShell 변수 및 표현의 사용; 대신, 명령 줄은 첫 번째 단계에서 문자열 변수로 내장 된 다음
Invoke-Expression
잠시 후.
따라서 많은 발전에도 불구하고 PowerShell은 외부 프로그램을 호출 할 때 훨씬 쉽게 탈출하지 못했습니다. 그러나 단일 크기의 문자열에 대한 지원을 도입했습니다.
Windows World에서 근본적으로 가능한지 궁금합니다. 껍데기 모든 토큰 화 및 견적 제거를 수행하십시오 예상대로, 앞쪽, 대상 프로그램에 관계없이, 그런 다음 결과 토큰을 통과하여 대상 프로그램을 호출하십시오.
추가로 mklement0의 훌륭한 답변:
거의 모든 실행 파일이 수락합니다 \"
탈출 한대로 "
. 그러나 CMD의 안전한 사용은 지연 확률을 사용하여 거의 가능합니다.
문자를 설명하기 위해 "
어떤 프로세스에, 할당하십시오 \"
환경 변수에 인용문을 전달해야 할 때마다 해당 변수를 사용하십시오. 예시:
SETLOCAL ENABLEDELAYEDEXPANSION
set q=\"
child "malicious argument!q!&whoami"
메모 SETLOCAL ENABLEDELAYEDEXPANSION
배치 파일 내에서만 작동하는 것 같습니다. 대화식 세션에서 지연된 전문가를 얻으려면 시작하십시오 cmd /V:ON
.
BatchFile이 DelayedExpansion과 함께 작동하지 않으면 일시적으로 활성화 할 수 있습니다.
::region without DELAYEDEXPANSION
SETLOCAL ENABLEDELAYEDEXPANSION
::region with DELAYEDEXPANSION
set q=\"
echoarg.exe "ab !q! & echo danger"
ENDLOCAL
::region without DELAYEDEXPANSION
다음으로 탈출 한 인용문이 포함 된 변수에서 동적 컨텐츠를 전달하려면 ""
당신은 교체 할 수 있습니다 ""
~와 함께 \"
확장시 :
SETLOCAL ENABLEDELAYEDEXPANSION
foo.exe "danger & bar=region with !dynamic_content:""=\"! & danger"
ENDLOCAL
이 교체는 안전하지 않습니다 %...%
스타일 확장!
경우 OP bash -c "g++-linux-4.1 !v_params:"=\"!"
안전한 버전입니다.
어떤 이유로 든 일시적으로 지연 확장을 가능하게하는 경우 옵션이 아닌 경우 다음 사항을 읽으십시오.
사용 \"
CMD 내에서 때때로 대신 특수 캐릭터를 탈출해야한다면 CMD는 조금 더 안전합니다. (일관성이 있다면 케어를 잊을 가능성이 적습니다 ...)
이를 달성하기 위해, 하나는 Caret가있는 인용문보다 우선합니다 (^"
), 리터럴이 추가로 백래시로 탈출해야하므로 아동 프로세스에 도달 해야하는 인용문 (\^"
). 모두 쉘 메타 문자는 탈출해야합니다 ^
또한 예를 들어 &
=> ^&
; |
=> ^|
; >
=> ^>
; 등.
예시:
child ^"malicious argument\^"^&whoami^"
원천: 모두가 명령 줄 인수를 잘못된 방식으로 인용합니다, "더 나은 인용 방법"을 참조하십시오.
동적 컨텐츠를 통과하려면 다음을 보장해야합니다.
변수를 포함하는 명령의 일부는 "인용"으로 간주되어야합니다. cmd.exe
(변수에 따옴표를 포함 할 수있는 경우 - 불가능합니다. 쓰지 마세요 %var:""=\"%
). 이것을 달성하기 위해 마지막 "
변수 이전과 첫 번째 "
변수는 그렇지 않습니다 ^
-에스코트. 이 둘 사이의 CMD-Metacharacters "
탈출해서는 안됩니다. 예시:
foo.exe ^"danger ^& bar=\"region with %dynamic_content% & danger\"^"
이것은 안전하지 않습니다 %dynamic_content%
타의 추종을 불허하는 인용문을 포함 할 수 있습니다.
예를 들어 배치 파일에서 실행되는 Unreal Engine Automation Tool의 경우 - 이것은 나에게 효과적이었습니다.
eg : -cmdline = " -messaging"-device = device -addcmdline = " -sessionid = sessionid = sessionsowner = 'oners'-sessionname = 'build'-dataprovidermode = local -logcmds = 'logmodity off'-execcmds = '자동화 목록 ;
이것이 누군가를 돕고 나를 위해 일했기를 바랍니다.