bash -c최소한 다음 예에서는 명령이 동일하지 않습니다.

bash -c최소한 다음 예에서는 명령이 동일하지 않습니다.

$somevariablebash가 필요하고 보안 위험을 초래하는 공백 및 기타 특수 문자가 포함될 수 있습니다. 다음 명령은 동일합니까? 그렇지 않다면 순위를 매길 수 있나요?

bash -c 'somecommand "$1"' bash "$somevariable"
bash -c "somecommand '$somevariable'"
bash -c "somecommand \"$somevariable\""

다음 명령은 동일합니까? 그렇지 않다면 순위를 매길 수 있나요?

find -exec sh -c 'something "$@"' sh {} \;
find -exec sh -c "something '{}'" \;
find -exec sh -c "something \"{}\"" \;
find -exec sh -c 'something "{}"' \;

각 그룹의 명령 간에 차이점을 찾을 수 없습니다.

에서"bash -c"로 실행되는 명령에 인수를 제공하는 방법. 여기서는 findutils 매뉴얼에서 메시지가 표시되는 이유를 알고 싶습니다.

find -exec sh -c 'something "$@"' sh {} \;

바꾸다

find -exec sh -c "something {}" \;

때문에

  • 견적 또는

  • {}실행할 명령 밖으로 이동sh -c

위의 두 번째 그룹에서 작성한 다른 명령도 작동합니까?

감사해요.


find -exec sh -c "something '{}'" \;그룹 의 두 번째 명령을 공격하려면 다음을 수행하십시오 find.

$ touch "'; echo world '"
$ find . -exec sh -c "ls '{}'" \;
''\''; echo world '\'''
''\''; echo world '\'''
world 

답변1

bash -c최소한 다음 예에서는 명령이 동일하지 않습니다.

$ var='a
$(uname)'

$ bash -c 'echo "$1"' bash "$var"
a
$(uname)

$ bash -c "echo '$var'"
a
$(uname)

$ bash -c "echo \"$var\""
a
Darwin

명령 find도 다릅니다.

$ touch 'a
> $(uname)'

$ find . -exec sh -c 'echo "$@"' sh {} \;
.
./a
$(uname)

$ find . -exec sh -c "echo '{}'" \;
.
./a
$(uname)

$ find . -exec sh -c "echo \"{}\"" \;
.
./a
Darwin

$ find . -exec sh -c 'echo "{}"' \;
.
./a
Darwin

따라서 다음은 임의의 코드 실행을 허용하는 것으로 보입니다.

  • bash -c "echo \"$var\""
  • find . -exec sh -c "echo \"{}\"" \;
  • find . -exec sh -c 'echo "{}"' \;

관련 정보