파일 설명자, 파이프, FIFO, 장치 등의 출력에서 ​​file(1)을 실행할 수 없습니다.

파일 설명자, 파이프, FIFO, 장치 등의 출력에서 ​​file(1)을 실행할 수 없습니다.

다른 명령의 출력에 대해 명령 을 실행하고 싶지만 file(1)얻을 수 있는 것은

$ file -sL <(echo \#include \<stdio.h\>)
/dev/fd/63: ERROR: (null)

이는 파일 5.04(Red Hat Enterprise Linux Server 릴리스 6.8)에서는 예상대로 작동하지만 파일 5.14(Wind River Linux 6.0.0.17)에서는 작동하지 않습니다.

답변1

사용중인 libmagic 라이브러리의 버그입니다 file.

간단한 해결 방법은 "쓸데없는 고양이 사용"입니다.

echo '#! /bin/sh' | file -
cat /path/to/fifo-or-special | file -

이 버그는 에서 처음 소개되었습니다.https://github.com/file/file/commit/fb6084e0f08:

commit fb6084e0f08aef8991afcb3eb74168a456601908
Author: Christos Zoulas <[email protected]>
Date:   Tue May 28 21:24:31 2013 +0000

    don't print a space if there was an error. (from Jan Kaluza)

그땐 고쳐졌지만오직FIFO가 아닌 블록 및 문자 장치의 경우https://github.com/file/file/commit/a9124dcb4e. 안불완전한<(...)Linux 에 대한 수정 사항이 포함되었습니다.https://github.com/file/file/commit/adbe541c32.

장치에 대한 수정 사항은 FIFO에 대해 복제될 수 있습니다. 답변 끝에 있는 패치를 참조하세요(이 사이트는 탭을 엉망으로 만들기 때문에 직접 적용하고 미러 전용 저장소에 위배된다는 점을 명심하세요).

하지만 여전히 남아 있습니다.

mkfifo fifo; file -s fifo

fifo: writable, no read permission

FIFO에 읽기 권한이 있기 때문에 어리 석고 잘못되었습니다.

이를 수리한다는 것은 libmagic의 절반을 다시 작성하거나 끔찍한 혼란에 ifdef 스파게티와 특수 케이스를 추가하는 것을 의미합니다.

diff --git a/src/fsmagic.c b/src/fsmagic.c
index 5204f20d..20b7f438 100644
--- a/src/fsmagic.c
+++ b/src/fsmagic.c
@@ -270,8 +270,10 @@ file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
    /* TODO add code to handle V7 MUX and Blit MUX files */
 #ifdef S_IFIFO
    case S_IFIFO:
-       if((ms->flags & MAGIC_DEVICES) != 0)
+       if((ms->flags & MAGIC_DEVICES) != 0) {
+           return 0;
            break;
+       }
        if (mime) {
            if (handle_mime(ms, mime, "fifo") == -1)
                return -1;

관련 정보