누군가가 물었다Ask Ubuntu에 대한 질문permission denied
Bash 쉘에 들어갈 때 왜 이런 일이 발생합니까?
/etc/profile
파일에 실행 권한이 없기 때문이라는 것을 알고 있습니다. 루트조차도 이를 실행할 수 없습니다( sudo /path/to/file/with/no/execute/bits
자동 오류로 실패 sudo /path/to...: command not found
). 나도 뿌리를 알아할 수 있는실행 비트 없이 디렉토리에 들어가 실행 불가능한 파일의 실행을 절대 금지하는 것은 특별합니다. 채팅에서는Eliah Kagan은 루트가 실행 불가능한 파일을 실행할 수 없는 이유는 루트를 보호하기 위한 것이라고 믿습니다.(아마도 실수로 위험한 코드가 실행되었기 때문일 것입니다).
나는 누군가가 그것을 실행하고 싶어하는 이유가 궁금했고 /etc/profile
누군가가 그것을 실행하고 싶다면 실제로 source
그것을 원할 것이라고 생각했습니다 (환경 및 쉘 변수를 설정하는 구성 파일이기 때문에). 그런 다음 source
일반 파일에는 실행 권한이 필요하지 않다는 것을 깨달았습니다 . 대신 source
현재 셸에서 파일을 실행하세요! 파일에는 모든 명령이 포함될 수 있으며 . file
직접 실행됩니다.
실행 권한을 제한하면 잠재적으로 위험한 코드가 실수로 실행되는 것을 방지할 수 있는데 왜 source
이 명령을 사용하여 실행할 수 없는 파일을 실행할 수 있습니까?
답변1
실행 불가능한 파일을 실행하면 실패할 것 같지 않습니다.고의로잠재적으로 위험한 코드가 실수로 실행되는 것을 방지합니다. 이는 단지 의미의 일부일 뿐입니다. "파일, 스크립트 또는 ELF 인터프리터에 대한 실행 권한이 거부되면" execve
실패합니다 . EACCES
(인용하고 있어요리눅스 execve
맨페이지.POSIX예: "새 프로세스 이미지 파일의 경로 접두사에 나열된 디렉터리에 대한 검색 권한이 거부되었거나 새 프로세스 이미지 파일에 대한 실행 권한이 거부되었습니다.") Unix/Linux는 사용자가 파일을 날려버리는 것을 방지하는 데 특별히 관심을 두지 않았습니다. 스스로 떨어져 있습니다.
내 생각엔 설명이 다소 단조롭다. 실행과 조달의 사양이 다르다. 직접 실행을 위해서는 커널이 주어진 명령을 실행하고 실행 권한을 적용해야 합니다. 파일을 얻는다는 것은 실제로 파일을 읽고 실행하는 것을 의미합니다.bash
맨페이지"검색된 파일은 PATH
실행 파일일 필요는 없습니다."라고 명확하게 명시되어 있습니다.POSIX 라고"그러나 일반적인 명령 검색과 달리가리키다유틸리티는 실행 가능하지 않아도 됩니다. ” ( .
와 같습니다 source
.)
바이너리가 실행 가능하지 않더라도 바이너리를 얻는 데 사용된 것과 유사한 기술을 사용하여 실행할 수 있습니다.
$ cp /bin/ls .
$ chmod 644 ls
$ /lib64/ld-2.26.so ./ls
선행은 이루기가 어렵다~의보다POSIX와의 비교는 bash
흥미롭습니다. 비 POSIX 모드에서 경로 없이 인수가 주어지면 POSIX 모드에서는 현재 디렉터리에서 찾으려고 시도합니다. POSIX에서는 이를 금지합니다.source
.
source
PATH
일부 이전 구현은 현재 디렉토리에서 검색합니다.문서, 값이 있더라도길그것을 허용하지 마십시오. 이 동작은 사용자가 트로이 목마에 대한 취약성을 피하려고 시도할 수 있다는 우려로 인해 이번 POSIX.1-2008 볼륨에서 생략되었습니다.가리키다밖의길.
source
하지만 경로가 있는 인수는 어떤 .
경우 든 처리되기 때문에 현재 논의에서는 실제로 크게 바뀌지 않습니다 . (실제로 무언가를 시도할 때 놀라움을 source
피하기 위해 항상 경로, 상대 경로라도 매개변수로 사용해야 합니다.source
반품당신의 PATH
. 이라는 파일을 만들고 in을 사용 test
하여 source test
파일을 가져와서 bash
무슨 뜻인지 확인해보세요. )