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하고 첫 번째 인수로 쉘 스크립트의 경로. 실제 인터프리터가 해당 마운트 포인트에 없을 수 있습니다.
__________
1 이 mount명령은 일반적으로 파일 시스템을 마운트 합니다 . 루프백 또는 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.