답변:
를 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/shPOSIX 호환이 아닌 경우 POSIX 호환 쉘의 경로를 사용하십시오 . 주의해야 할 하위 레벨 "gotchas"도 있습니다.
- 실행하려면 인터프리터의 전체 경로 이름을 알아야합니다. 이것은 다른 벤더가 다른 장소에 물건을 넣기 때문에 공급 업체 간 이식성을 방지 할 수 있습니다 (예 :
/bin/awk대/usr/bin/awk).
다른 이유가 있지만 보안 측면에서 스크립트가 올바른 경로에 대해 가정하지 않기를 바랍니다. 잘못되어 잘못된 쉘이나 인터프리터를 실행하면 어떻게 되나요? 악의적 인 사용자가 삽입 한 것입니까? 또는 특정 쉘에 의존하고 잘못된 쉘을 사용하면 충돌이 발생합니까?
사용자는 자신의 경로를 망쳐 놓고 물건을 깰 수 있습니다-사용자를 믿지 마십시오 :-) 나는 사용자가 경로로 잘못된 일을하는 것에 의존하는 수많은 공격을 수행했습니다. 일반적인 스크립트 호출
예, 본인이 직접 스크립트를 작성했다면 자신의 경로를 정리했다고 주장 할 수는 있지만 통역사는 이러한 결정을 내릴 수 없습니다.
$PATH. . 높은 권한이 없으면 어떻게 LD_PRELOAD사용됩니까? PS Downvoted 보안에 대해 잘못된 경고를 표시하는 것은 보안에 해 롭습니다.
PATH공격 벡터가 있는 경우의 예를 들어 주시고 전체 접근 방식을 다시 생각해야 할 다른 공격 벡터가 많지 않은가?
ruby있지만/home/user/myrubyinterpreter원하는 경우 지정하지 않아도 됩니다.