문제

배치 파일의 매개 변수의 이중 인용문을 모두 이중 인용문으로 대체하는 방법은 무엇입니까? 이것은 내 현재 배치 파일로 문자열 내부의 모든 명령 줄 매개 변수를 확장합니다.

@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.

인용 이내에 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 = '자동화 목록 ;

이것이 누군가를 돕고 나를 위해 일했기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top