어떤 유형의 Linux 파일을 프로그램으로 얻거나 호출할 수 있습니까?

어떤 유형의 Linux 파일을 프로그램으로 얻거나 호출할 수 있습니까?

Linux에는 7가지 파일 형식이 있습니다. (참조 -https://en.wikipedia.org/wiki/Unix_file_types)

  1. 일반 파일
  2. 목차
  3. 블록(버퍼) 파일
  4. 문자(버퍼되지 않은) 파일
  5. 파이프(명명된 파이프, 선입선출) 파일
  6. 파일이나 디렉터리에 대한 심볼릭 링크
  7. 소켓 파일

(*심볼릭링크 유형의 경우 7가지 유형 모두 연결이 가능합니다.)

기본적인 방법으로는,일반 파일그리고파일에 대한 심볼릭 링크프로그램으로 구해서 호출할 수 있습니다.

. regular_file_script.sh
regular_file_program
. symlink_to_regular_file_script.sh
symlink_to_regular_file_program

내가 아는 한,목차그리고디렉토리에 대한 심볼릭 링크소스 스크립트로 사용하거나 프로그램으로 호출할 수 없습니다.

최근에 나는 내가 사용할 수 있다는 것을 발견했습니다.파이프라인 파일소스 스크립트로. 파이프 파일을 만들고 여기에 스크립트를 작성한 다음 다른 터미널에서 가져올 수 있습니다. 예는 다음과 같습니다.

터미널 A에서:

$ mkfifo /tmp/pipe_script.sh ; echo 'echo i am a pipe_script' > /tmp/pipe_script.sh

터미널 B에서:

$ cat /tmp/test.sh
#!/bin/sh

echo sourcing a pipe script
. /tmp/pipe_script.sh
echo complete

$ /tmp/test.sh
sourcing a pipe script
i am a pipe_script
complete

그러나 나는파이프라인 파일프로그램으로 직접 호출할 수 없습니다. 권한을 로 설정해도 오류가 755발생합니다 . Permission denied예를 들어:

터미널 A에서:

$ mkfifo --mode 755 /tmp/pipe_program ; echo 'echo i am the pipe_program' > /tmp/pipe_program

터미널 B에서:

$ cat /tmp/test.sh
#!/bin/sh

# echo sourcing a pipe script
# . /tmp/pipe_script.sh
echo call a pipe program
/tmp/pipe_program
echo complete

$ /tmp/test.sh
call a pipe program
/tmp/test.sh: line 6: /tmp/pipe_program: Permission denied
complete

명명된 파이프파일을 얻을 수는 있지만 프로그램으로 호출할 수는 없나요?

전체적으로 이 7가지 유형 중 스크립트로 얻을 수 있거나 프로그램으로 호출할 수 있는 Linux 파일 유형은 무엇입니까?

답변1

sourceBASH가 읽을 수 있는 한 무엇이든 편집할 수 있습니다. 심지어 장치 파일도 편집할 수 있습니다(권한이 올바른 경우).

"프로그램"은 완전히 다른 질문이며 일반 파일 외에는 해당 이름을 들어본 적이 없습니다.

응용 프로그램을 실행하는 데 기호 링크는 거의 사용되지 않습니다. 일반 Linux 시스템에는 수많은 응용 프로그램에 대한 하드 링크가 포함되어 있지만 심볼릭 링크는 일반적으로 공유 라이브러리용으로 예약되어 있습니다. 하드 링크는 일반 파일과 다르지 않으며 권한을 포함한 모든 것을 공유합니다.

답변2

다른 사람들이 말했듯이, 읽을 수 있는 모든 것은 쉘에서 얻거나 쉘로 파이프될 수 있습니다. 이는 다른 통역사에게도 적용됩니다.예를 들어파이썬.

그러나 Linux 커널은 선택적으로 기호 링크를 확인한 후 일반 파일로 확인되는 경로만 실행합니다. 간접적으로 기록된 내용입니다.man execve, 이는 EACCES반환되는 경우("권한 거부" 오류가 표시됨) 를 나타냅니다.

이 파일 또는 스크립트 해석기는 일반 파일이 아닙니다.

execve기호 링크를 해결하지만 오류를 반환하도록 다른 유사한 시스템 호출을 구성할 수 있습니다.man execveat그리고 AT_SYMLINK_NOFOLLOW.

일반 파일에 대한 마지막 명시적 검사를 볼 수 있습니다.do_open_execat커널 에서:

    /*
     * may_open() has already checked for this, so it should be
     * impossible to trip now. But we need to be extra cautious
     * and check again at the very end too.
     */
    err = -EACCES;
    if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode) ||
             path_noexec(&file->f_path)))
        goto exit;

답변3

파이프라인을 실행 파일로 실행할 수 없는 가장 확실한 이유는 임의 액세스를 지원하지 않기 때문입니다.

실행 파일에는 다음이 포함됩니다.

  1. 커널은 파일을 열고 파일 헤더의 몇 바이트를 읽습니다.
  2. 헤더 바이트를 기반으로 실행 파일의 유형을 결정하고 프로그램의 추가 처리를 위해 올바른 바이너리 형식 모듈을 디스패치합니다.
  3. 결국 실행 파일은 파일을 다시 열고 전체 헤더를 읽으려는 사용자 공간 해석기로 처리됩니다.

파일이 FIFO인 경우 인터프리터는 파일을 다시 열고 동일한 내용을 읽을 수 없습니다. 읽기 위해 FIFO가 열릴 때마다만나다이는 쓰기를 위해 FIFO를 여는 작성기를 사용하여 수행됩니다. ㅏ새로운파이프 개체를 만든 다음 이를 사용하여 두 프로세스 간 통신을 수행합니다.

관련 정보