x-shellscript를 x-executable로 변환한 후 매개변수 $0이 전체 경로가 아닌 기본 이름만 제공하는 이유는 무엇입니까?

x-shellscript를 x-executable로 변환한 후 매개변수 $0이 전체 경로가 아닌 기본 이름만 제공하는 이유는 무엇입니까?

내 문제는 이 매개변수가 $0동일한 결과를 제공하며 ${0##*/}이는 SHC 프로그램을 사용하여 x-shellscript를 x-executable로 변환한 후에 발생한다는 것입니다!

운영 체제: Debiab-8.2-jessie SHC 버전: 3.8.7 cmd 사용:shc -f script.bash

컴파일된 script.x는 추가 bin 경로(sudo에 알려지지 않음)에 있습니다. 노트나는 $0 매개변수를 인쇄하는 hello world 프로그램을 만들었고 항상 기본 이름을 제공합니다!

내 스크립트 파일에는 다음이 포함됩니다.

#!/bin/bash
((!EUID)) || exec sudo "$0"
# shellcode ...

실행하면 다음과 같은 결과가 나타납니다.

sudo: 스크립트 이름: 명령을 찾을 수 없습니다.

확인한 결과 매개변수가 x 실행 파일 과 $0동일하거나 내부에 있음 ${0##*/}을 발견했습니다 !$(basename $0)

스크립트에 절대 경로를 넣지 않고 어떻게 처리할 수 있나요? 아니면 SHC를 사용하여 쉘을 x 실행 파일로 컴파일할 때 무엇을 알아야 합니까?

답변1

SHC를 선택하는 이유는 무엇입니까?

첫째, "애호가" 동기를 고려할 때 SHC를 사용하는 이유는 무엇입니까? 다음은 해당 설명에서 발췌한 것입니다.

실행되면 컴파일된 바이너리는 shell -c 옵션을 사용하여 코드를 해독하고 실행합니다. 불행히도 실제 C 프로그램처럼 속도가 향상되지는 않습니다.

컴파일된 바이너리는 여전히 쉘 코드의 첫 번째 줄에 지정된 쉘(즉, #!/bin/sh)에 의존하므로 shc는 완전히 독립적인 바이너리를 생성하지 않습니다.

SHC의 주요 목적은 쉘 스크립트가 수정되거나 검사되지 않도록 보호하는 것입니다.

  • 내 생각(간략하게 설명하겠습니다): 비록 귀하의 동기가 수정을 방지하는 "주요 목적"이라고 명시되어 있더라도, 결심한 사람은 여전히 ​​원본 스크립트를 복원(따라서 수정)할 수 있습니다! SHC는 본질적으로 다음을 제공합니다.모호한 보안, 다음과 같이 사용될 때기초적인보안 조치. 이것이 도움이 되지 않는다면 SHC를 버리고 대부분의 다른 사람들처럼 쉘 스크립트를 사용하는 것이 좋습니다. 쉘 스크립트에 대한 실제 보안이 필요한 경우 SHC나 "컴파일러"를 사용하지 않고 특정 질문을 하는 것이 좋습니다.

특정 $0 질문

다음에서 SHC 3.8.9를 다운로드했습니다.이 페이지그냥 시도해 보세요.

Ubuntu 14.04 LTS에서 문제를 재현할 수 없습니다.

#!/bin/bash
echo "Hello, world. My name is \`$0'"

테스트 실행

$ ./shc -f my_test.bash
$ ~/path/to/my_test.bash.x

Hello, world. My name is `~/path/to/my_test.bash.x'

따라서 분명히 우리 시스템은 다릅니다. 귀하의 OS, SHC 버전 및특정한shc"컴파일"하는 데 사용하는 쉘 스크립트와 명령줄입니다.

왜 경로가 필요합니까?

스크립트가 경로를 알아야 하는 이유는 무엇입니까? 파일을 저장하기 위해 스크립트를 사용하고 있습니까? 사용자가 지정하지 않은 경우 실행되는 디렉터리가 "기본값"입니까? 이것이 좋은 아이디어인지 여부는 의견의 문제이지만, 동기를 이해하면 답변의 범위를 좁히는 데 도움이 될 수 있습니다.

현재 디렉토리를 얻는 방법

pwd명령은 현재 디렉터리를 가져옵니다. 대부분의 경우 다음을 사용하여 스크립트의 전체 경로를 조합할 수 있습니다(명시적 상대 경로를 사용하여 실행된다고 가정).

realname="`pwd`/$0"

...다음과 같은 값을 생성합니다.

/path/to/script/./yourscript.bash.x

추가 항목은 ./단지 "현재 디렉터리"를 의미하므로 미학적으로 유감스러울 수 있지만 결과에 부정적인 영향을 미치지는 않습니다.

스크립트가 귀하의 것이라면 대신 $PATH사용해야 합니다 . 그러나 우리는 원래 질문의 범위를 벗어나므로 경로 이름을 결정하는 것이 까다로운 프로세스가 될 수 있다는 점을 간단히 언급하겠습니다. 특히 그렇게 하는 방법을 사용해야 하는 경우에는 더욱 그렇습니다. , 그런 다음 다른 질문에 맡기고 이러한 라인을 따라 구체적인 문제 설명을 작성하는 것이 좋습니다.whichpwd

답변2

이는 경로 검색을 통해 바이너리를 찾을 때 bash(및/또는 ld.so)가 실행 파일의 전체 이름을 argv[0]에 넣지 않기 때문인 것 같습니다. 종속성 경로 대신 런타임에 디렉터리를 지정하면 올바른 이름을 얻게 됩니다.

관련 정보