이것은 확실히 작동합니다. 실행할 수 ./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"
위의 예를 로 변경 해야 합니다 "$@"
. 큰따옴표는 개별 매개변수가 공백으로 분할되지 않고 파일 이름 없이 전달되도록 하기 때문에 중요합니다. 와일드카드.