shebang과 경로


22

shebang에 경로가 필요한 이유는 무엇입니까?

잘못된

#!ruby

옳은

#!/usr/local/bin/ruby

#!/usr/bin/env ruby

운영 체제에는 등록 된 명령의 경로와 관련된 정보가 있어야하며 왜 명령이 제공 될 것으로 예상합니까?

답변:


22

아마도 커널을 더 단순하게 유지할 것입니다. 커널이 실행 파일을 찾기 위해 경로를 검색한다고 생각하지 않습니다. 그것은 C 라이브러리에 의해 처리됩니다. #!표준 C 라이브러리를 사용하지 않는 커널에서 처리됩니다.

또한 커널에는 경로가 무엇인지에 대한 개념이 없다고 생각합니다. $PATH환경 변수이며 프로세스에만 환경이 있습니다. 커널은 그렇지 않습니다. 나는 그것이 exec를 수행 한 프로세스의 환경에 액세스 할 수 있다고 생각하지만, 현재 커널에있는 환경은 그런 환경 변수에 액세스한다고 생각하지 않습니다.


5

PATH사용하여 의미 검색을 얻을 수 있습니다 env.

#!/usr/bin/env ruby  

당신이 원하는 의미가 있습니다

#!ruby

에 따라 PATH모범 사례로 간주되지 않는 이유 는 스크립트가 PATH 환경 변수의 내용에 대한 가정을 할 수 없으므로 바이너리의 "순차 종속성 모델"이 깨지기 때문입니다.

  1. /bin 부팅시 필요한 실행 파일을 포함합니다.
  2. /usr/bin OS 설치에 사용 된 다른 실행 파일이 들어 있습니다.
  3. /usr/local/bin 기본 OS의 일부가 아닌 시스템 관리자가 설치 한 실행 파일이 들어 있습니다.
  4. ~/bin 사용자 자신의 실행 파일을 포함합니다.

각 레벨은 시퀀스의 후반에 바이너리가 존재한다고 가정해서는 안되며, 이는 더 많은 "응용 프로그램"이지만 더 "기초"인 바이너리에 의존 할 수 있습니다. 그리고 PATH 변수는 응용 프로그램에서 기본으로 실행되는 경향이 있습니다. 이는 위의 자연 의존성과 반대되는 방향입니다.

문제를 설명하기 ~/bin위해 스크립트 /usr/local/bin가 Ruby를 호출 하는 스크립트를 호출 하면 어떻게되는지 물어보십시오 . 해당 스크립트가에 OS 설치 버전 /usr/bin/ruby또는 사용자가 가지고있는 개인 사본에 의존해야합니까 ~/bin/ruby? PATH검색은 후자와 관련된 예측할 수없는 의미를 제공하며 (아마 ~/bin/ruby깨진 기호 링크 일 수 있음) #!전자 를 제공하기 위한 경로를 굽는 중 입니다.

다른 플랫폼 독립적 인 "운영 체제 ... 등록 된 명령의 경로에 관한 정보"는 실제로 없으므로 가장 간단한 방법은에서 제공되는 경로를 고집하는 것입니다 #!.


0

나는 그것이 필요하거나 원한다면 대체 통역사를 지정할 수 있다고 믿습니다. 예를 들면 다음과 같습니다.

#!/home/user/myrubyinterpreter

쉘 스크립트에서 더 자주 볼 수 있습니다.

#!/bin/bash
#!/bin/sh
#!/bin/dash
#!/bin/csh

4
그러나 왜 그렇게해야합니까? 로 루비를 직접 실행할 수는 ruby있지만 /home/user/myrubyinterpreter원하는 경우 지정하지 않아도 됩니다.
Michael Mrozek

마이클의 요점은 내가 묻는 것입니다.
sawa

0

에서 클래식 쉘 스크립트 책 :

쉘 스크립트는 일반적으로로 시작합니다 #! /bin/sh. /bin/shPOSIX 호환이 아닌 경우 POSIX 호환 쉘의 경로를 사용하십시오 . 주의해야 할 하위 레벨 "gotchas"도 있습니다.

  • 실행하려면 인터프리터의 전체 경로 이름을 알아야합니다. 이것은 다른 벤더가 다른 장소에 물건을 넣기 때문에 공급 업체 간 이식성을 방지 할 수 있습니다 (예 : /bin/awk/usr/bin/awk).

-2

다른 이유가 있지만 보안 측면에서 스크립트가 올바른 경로에 대해 가정하지 않기를 바랍니다. 잘못되어 잘못된 쉘이나 인터프리터를 실행하면 어떻게 되나요? 악의적 인 사용자가 삽입 한 것입니까? 또는 특정 쉘에 의존하고 잘못된 쉘을 사용하면 충돌이 발생합니까?

사용자는 자신의 경로를 망쳐 놓고 물건을 깰 수 있습니다-사용자를 믿지 마십시오 :-) 나는 사용자가 경로로 잘못된 일을하는 것에 의존하는 수많은 공격을 수행했습니다. 일반적인 스크립트 호출

예, 본인이 직접 스크립트를 작성했다면 자신의 경로를 정리했다고 주장 할 수는 있지만 통역사는 이러한 결정을 내릴 수 없습니다.


이 문제는 스크립트가 높은 권한으로 실행되는 경우에만 적용됩니다. shebang과 setxid가 함께 잘 작동하지 않기 때문에 흔치 않은 일이며 $PATH. . 높은 권한이 없으면 어떻게 LD_PRELOAD사용됩니까? PS Downvoted 보안에 대해 잘못된 경고를 표시하는 것은 보안에 해 롭습니다.
Gilles 'SO- 악마 중지'

setxid에 대한 당신의 요점은 유효하지만, 그것은 완벽하게 유용한 공격 벡터이므로 확실히 잘못된 경고는 아닙니다
Rory Alsop

1
PATH공격 벡터가 있는 경우의 예를 들어 주시고 전체 접근 방식을 다시 생각해야 할 다른 공격 벡터가 많지 않은가?
Gilles 'SO- 악마 그만해'

@Gilles-+1 당신은 좋은 점이 있습니다. 분명히 이것이 깨지는 것처럼 다른 방법이 유효한 것처럼 보일 수도 있지만, 고칠 수있는 깨진면에서 이것은 쉬운 방법입니다.
Rory Alsop
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.