답변:
를 PATH
사용하여 의미 검색을 얻을 수 있습니다 env
.
#!/usr/bin/env ruby
당신이 원하는 의미가 있습니다
#!ruby
에 따라 PATH
모범 사례로 간주되지 않는 이유 는 스크립트가 PATH 환경 변수의 내용에 대한 가정을 할 수 없으므로 바이너리의 "순차 종속성 모델"이 깨지기 때문입니다.
/bin
부팅시 필요한 실행 파일을 포함합니다./usr/bin
OS 설치에 사용 된 다른 실행 파일이 들어 있습니다./usr/local/bin
기본 OS의 일부가 아닌 시스템 관리자가 설치 한 실행 파일이 들어 있습니다.~/bin
사용자 자신의 실행 파일을 포함합니다.각 레벨은 시퀀스의 후반에 바이너리가 존재한다고 가정해서는 안되며, 이는 더 많은 "응용 프로그램"이지만 더 "기초"인 바이너리에 의존 할 수 있습니다. 그리고 PATH 변수는 응용 프로그램에서 기본으로 실행되는 경향이 있습니다. 이는 위의 자연 의존성과 반대되는 방향입니다.
문제를 설명하기 ~/bin
위해 스크립트 /usr/local/bin
가 Ruby를 호출 하는 스크립트를 호출 하면 어떻게되는지 물어보십시오 . 해당 스크립트가에 OS 설치 버전 /usr/bin/ruby
또는 사용자가 가지고있는 개인 사본에 의존해야합니까 ~/bin/ruby
? PATH
검색은 후자와 관련된 예측할 수없는 의미를 제공하며 (아마 ~/bin/ruby
깨진 기호 링크 일 수 있음) #!
전자 를 제공하기 위한 경로를 굽는 중 입니다.
다른 플랫폼 독립적 인 "운영 체제 ... 등록 된 명령의 경로에 관한 정보"는 실제로 없으므로 가장 간단한 방법은에서 제공되는 경로를 고집하는 것입니다 #!
.
에서 클래식 쉘 스크립트 책 :
쉘 스크립트는 일반적으로로 시작합니다
#! /bin/sh
./bin/sh
POSIX 호환이 아닌 경우 POSIX 호환 쉘의 경로를 사용하십시오 . 주의해야 할 하위 레벨 "gotchas"도 있습니다.
- 실행하려면 인터프리터의 전체 경로 이름을 알아야합니다. 이것은 다른 벤더가 다른 장소에 물건을 넣기 때문에 공급 업체 간 이식성을 방지 할 수 있습니다 (예 :
/bin/awk
대/usr/bin/awk
).
다른 이유가 있지만 보안 측면에서 스크립트가 올바른 경로에 대해 가정하지 않기를 바랍니다. 잘못되어 잘못된 쉘이나 인터프리터를 실행하면 어떻게 되나요? 악의적 인 사용자가 삽입 한 것입니까? 또는 특정 쉘에 의존하고 잘못된 쉘을 사용하면 충돌이 발생합니까?
사용자는 자신의 경로를 망쳐 놓고 물건을 깰 수 있습니다-사용자를 믿지 마십시오 :-) 나는 사용자가 경로로 잘못된 일을하는 것에 의존하는 수많은 공격을 수행했습니다. 일반적인 스크립트 호출
예, 본인이 직접 스크립트를 작성했다면 자신의 경로를 정리했다고 주장 할 수는 있지만 통역사는 이러한 결정을 내릴 수 없습니다.
$PATH
. . 높은 권한이 없으면 어떻게 LD_PRELOAD
사용됩니까? PS Downvoted 보안에 대해 잘못된 경고를 표시하는 것은 보안에 해 롭습니다.
PATH
공격 벡터가 있는 경우의 예를 들어 주시고 전체 접근 방식을 다시 생각해야 할 다른 공격 벡터가 많지 않은가?
ruby
있지만/home/user/myrubyinterpreter
원하는 경우 지정하지 않아도 됩니다.