RHEL에 디렉토리를 마운트 할 때 NOEXEC 플래그는 무엇을 의미합니까?


11

마운트 할 때 NOEXEC 플래그를 이해하려고합니다.

/ tmp 디렉토리가 '/'와 다른 드라이브에 마운트되어 있고 NOEXEC가있는 atm에 액세스 할 수없는 다른 기계의 / tmp 디렉토리 내에 실행 문제가 있습니다. 내 컴퓨터에서이 시나리오를 시도하고 다시 만들고 싶었지만 두 번째 하드 드라이브가 없습니다. 다음 명령을 시도했습니다.

mount --bind /test1 /test2

그런 다음 bind플래그 를 제거하고 NOEXEC/ etc / fstab에 추가 했습니다. 그런 다음 / test2에 test.sh라는 파일을 만들어 'hello world'만 에코합니다. 나는 그것을 시도하고 실행하고 '권한이 거부되었습니다'라고 말했습니다. 그런 다음 chmod 777 test.sh실행하고 파일을 정상적으로 실행할 수있었습니다. NOEXEC 플래그가 아무것도 실행하지 않아야한다고 생각 했습니까?

mount --bind /test1 /test2완전히 다른 물리적 드라이브 설치와 동일하지? / test1과 / test2에서와 같이 다른 드라이브에 있습니까?


바인드 마운트 특유의 희생자가 될 것 같습니다. 이 답변을 참조하십시오 .
Kamil Maciorowski

답변:


7

mount명령의 옵션 'NOEXEC'플래그 는 마운트 된 파일 시스템 1 에서 실행 가능 바이너리를 실행할 수 없습니다 . 그러나 스크립트 (she-bang 줄로 시작하는 텍스트 파일, 즉으로 시작하는 줄 #!)가 일부 셸 (bash)에 제공되면 해당 줄에 이름이 지정된 실행 파일 (예 :)을 실행 /usr/bin/perl하고 첫 번째 인수로 쉘 스크립트의 경로. 실제 인터프리터가 해당 마운트 포인트에 없을 수 있습니다.
__________
1mount명령은 일반적으로 파일 시스템을 마운트 합니다 . 루프백 또는 bind마운트는이 일반성에 대한 예외로 간주 될 수 있습니다. 일부 경우 (예 :) /tmp이 파일 시스템에는 하나의 디렉토리 만 포함됩니다.


sh 파일은 / test2에 있지만 / test2가 아니라 / bin / sh에서 실행되고 있습니까? 다른 시스템에는 쉘 스크립트를 / tmp 디렉토리에 기록한 후 실행하는 Java 프로세스가 있습니다. 나는 그것이 만들고있는 쉘 스크립트가 #!/bin/sh맨 위에 있다는 것을 기억한다고 생각한다 . Java를 참조하고 / bin / sh를 참조하는 것 이외의 쉘 스크립트가 어떻게 실행되는지 알 수 없습니다. 그것이 / bin / sh를 참조하고 있고 bin 디렉토리에 실행 권한이 있다면 왜 쉘 스크립트가 내 테스트 에서처럼 실행되지 않습니까?
user972276

그것은 모두 쉘 / 프로그램 호출에 달려 있으며 쉘 스크립트는 ELF가 아니며 직접 실행할 수 없지만 일부 쉘은 NOEXEC에 마운트 된 FS의 스크립트를 실행할 수 없으며 죽을 것입니다. 이 경우 / bin / sh의 동작이 무엇인지 확실하지 않습니다. (특히 사용중인 것을 모르기 때문에 몇 가지 맛이 있습니다).
KJ4IPS

셸을 사용하면 시스템에서 #을 알 수 있습니다! 적절한 인터페 처 (/ bin / bash /tmp/file.sh)를 호출하지만 Java 비트가 (/tmp/file.sh)를 호출하는 경우 작동하지 않습니다.
KJ4IPS

Java 인스턴스가 / tmp 디렉토리에 없으며 쉘 스크립트를 올바르게 실행하려면 인터프리터를 사용해야합니까? Java에 내장 기능이 없으면 / tmp 디렉토리에서 여전히 실행되지 않습니다.
user972276

내 의견으로는 당신의 대답 은 shebang을 읽는 것이 쉘의 일 이라고 잘못 주장하고 있습니다. 이 답변을 참조하십시오 .
Kamil Maciorowski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.