스크립트를 사용하여 표준 입력에서 sh를 호출하고 명령줄 인수를 전달합니다.

스크립트를 사용하여 표준 입력에서 sh를 호출하고 명령줄 인수를 전달합니다.

이것은 확실히 작동합니다. 실행할 수 ./test1.sh cats있고 매개변수가 cats올바르게 전달되었습니다 ls.

$ cat test1.sh
#!/bin/sh
ls -l $1

두 번째 예(첫 번째 예와 내용은 동일하지만 암호화됨)가 동일한 방식으로 작동하도록 만드는 방법을 알려주실 수 있나요? 비밀번호는 "비밀번호" 입니다. openssl위 스크립트를 출력하고 ls -l실행합니다. 그런데 명령줄 인수를 어떻게 전달합니까?

$ cat test2.sh
#!/bin/sh
echo "U2FsdGVkX1/m01Eg0CvZ7DiBi5Nf81+JrCWfKIDI9WtbkTZIVLhZskkKIioVfbSe"|openssl enc -base64 -d -aes-256-cbc|sh $1

명확히하기 위해 test2.sh다음과 같습니다.

$ cat test3.sh
#!/bin/sh
printf '%s\n' '#!/bin/sh' 'ls -l $1' | sh $1

답변1

질문의 이전 버전에서 이미 해당 내용이 있었습니다. -s옵션을 다음으로 전달하세요 sh.

echo "U2FsdGVkX1/m01Eg0CvZ7DiBi5Nf81+JrCWfKIDI9WtbkTZIVLhZskkKIioVfbSe" | openssl enc -base64 -d -aes-256-cbc | sh -s "$1"

이는 쉘이 표준 입력에서 명령을 읽으면서 명령줄(이후 -s)의 인수를 표준 입력에서 오는 스크립트 코드에 대한 위치 인수로 받아들이도록 지시합니다. 물론, 쉘 변수는 타당한 이유가 없는 한 항상 인용되어야 하며, "@"장기적으로는 (모든 인수)를 쉘에 전달하는 것이 더 유용할 수 있습니다.

test1.sh그러므로 ;의 쉘 변수에 대한 모든 참조를 인용하는 것도 현명합니다. 예를 들어,

ls -l "$1"

위에 제시된 첫 번째 솔루션은 "일반" 매개변수에 대해 작동하는 것 같습니다. 그러나 다음으로 시작하는 매개변수의 경우를 처리하려면-, 바람직하게는 sh -s -- "$1"(또는  "$@")을 수행합니다. 예를 들어,

#!/bin/sh
code="U2FsdGVkX1/m01Eg0CvZ7DiBi5Nf81+JrCWfKIDI9WtbkTZIVLhZskkKIioVfbSe"
echo "$code" | openssl enc -base64 -d -aes-256-cbc | sh -s -- "$@"

(명령줄을 더 짧게 만들기 위해 암호화된 스크립트를 변수에 넣었으므로 슈퍼유저가 열을 표시하는 데 적합합니다.)

답변2

스크립트는 비밀번호를 요청하고 암호화된 스크립트를 해독한 후 기본 스크립트에 전달된 첫 번째 명령줄 옵션을 사용하여 실행합니다.

#!/bin/bash

bash <(
    openssl enc -base64 -d -aes-256-cbc <<<'U2FsdGVkX1/m01Eg0CvZ7DiBi5Nf81+JrCWfKIDI9WtbkTZIVLhZskkKIioVfbSe'
) "$1"

#!이는 암호 해독 스크립트의 - 행을 사용하지 않지만 제대로 작동한다고 가정합니다 bash(그리고 항상 성공적으로 암호 해독된다고 가정합니다). 암호 해독 스크립트는 호출 시 첫 번째 명령줄 인수와 함께 프로세스 대체를 bash통해 암호 해독 스크립트 로 전달됩니다.openssl

해독된 스크립트를 디스크에 작성하려면 올바르게 해독된 경우에만(해당 인터프리터를 사용하여) 실행한 다음 삭제하십시오.

#!/bin/bash

tmpscript=$(mktemp)
trap 'rm -f "$tmpscript"' EXIT

if ! openssl enc -base64 -d -aes-256-cbc <<<'U2FsdGVkX1/m01Eg0CvZ7DiBi5Nf81+JrCWfKIDI9WtbkTZIVLhZskkKIioVfbSe' >$tmpscript
then
    exit 1
fi

chmod +x "$tmpscript"
"$tmpscript" "$1"

기본 스크립트의 모든 명령줄 매개변수를 해독된 스크립트에 전달하려면 "$1"위의 예를 로 변경 해야 합니다 "$@". 큰따옴표는 개별 매개변수가 공백으로 분할되지 않고 파일 이름 없이 전달되도록 하기 때문에 중요합니다. 와일드카드.

관련 정보