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.