나는 명령을 실행할 때 그것을 안다
chmod +x filename
bash는 내 파일을 실행 파일로 만듭니다. 파일을 실행 파일로 변경하려면 파일 아키텍처에 정확히 어떤 일이 발생합니까? 즉, 커널은 이 파일이 실행 가능하다는 것을 어떻게 알 수 있습니까?
그냥 내 괴상한 근육을 운동하려고합니다.
답변1
파일의 "아키텍처"변하지 않는다– 올바른 형식인지 확인하는 것은 귀하에게 달려 있습니다. 즉, 파일이미유효한 ELF 바이너리, 유효한 헤더가 있는 스크립트 #!
또는 특정 커널이 인식하는 다른 것(예: a.out 또는 MZ/PE)이어야 합니다.
커널 chmod
에 사용자가허용된이 파일을 실행하려면 이는 작은 보안 장벽 역할을 할 뿐만 아니라 특정 종류의 사고를 예방할 수도 있습니다. ( +x
여기서는 의 축약형입니다 ugo+x
. 이는 읽기/쓰기와 같은 권한 비트입니다.)
커널이 인식하지 못하는 파일에 +x를 설정하면 exec
시스템 호출에서 오류 코드만 반환됩니다. (일부 쉘에는 이에 대한 특별한 처리 기능이 있습니다. 커널이 "인식할 수 없는 형식"을 보고하면 쉘은 파일을 스크립트로 해석하려고 시도합니다.내부적으로, 이전에 쉘스크립트가 작동했던 방식은 다음과 같습니다 #!
.발명하다.)
답변2
파일 내용은 전혀 변경되지 않습니다. 일반적인 Unix용으로 설계된 파일 시스템은 모든 파일에 대한 정보 저장을 지원합니다. 이를 흔히 파일의 "메타데이터"라고 합니다.
이것이 일부 파일 시스템에서 비슷한 결과를 얻지 못하는 이유입니다. 즉, FAT에는 Unix 권한과 관련된 데이터를 저장하기 위해 설계된 내장 공간이 없으며 Unix는 일반적으로 이러한 파일 시스템 볼륨을 마운트할 때 특수 매개변수를 사용하여 이를 해결합니다. 따라서 일반적으로 FAT 드라이브의 모든 파일은 마운트에 의해 지정된 것과 동일한 권한을 갖습니다. (ISO9660과 같은 다른 파일 시스템에서도 비슷한 동작이 예상되지만 일반적으로 쓸 수는 없습니다.) 이러한 방식으로 마운트된 볼륨에서는 chmod +x
실제로 아무것도 변경되지 않습니다.
간단히 말해서, 커널이 이를 아는 방법은 파일 시스템 드라이버를 확인하는 것입니다. Unix용으로 설계된 일반적인 파일 시스템의 경우 해당 드라이버는 Unix 스타일 권한이 저장된 위치 읽기를 지원합니다.
chmod는 단순히 드라이브의 해당 지점을 변경합니다.