파일 읽기 작업 내에서 동적 콘텐츠를 생성할 수 있습니까?

파일 읽기 작업 내에서 동적 콘텐츠를 생성할 수 있습니까?

파일 이름을 기반으로 파일 콘텐츠를 생성할 수 있나요?

.conf내용이 파일 이름에만 의존하는 유사한 파일이 많이 필요합니다 .

"동적" 파일을 만들고 이를 가리키는 심볼릭 링크를 생성할 수 있나요?

어쩌면 fifo가 해결책일 수도 있지만 빌드 스크립트에서 파일 이름을 얻을 수 없습니다.

zsh$ mkfifo ./dynamic.conf
zsh$ ln -s ./dynamic.conf ./case1.conf
zsh$ echo $0  > ./dynamic.conf & 
zsh$ cat ./case1.conf

나는 zsh(이 필요하다 case1.conf)을 가지고 있다.

답변1

완전히 다른 접근법내가 아는 건 마지막 대답이 눈을 굴리게 만들 것이라는 것뿐이니까.

inotify이 튜토리얼에서는 이것이 실제로 Linux에만 적용 된다는 것을 의미합니다. 문제가 완전히 해결됩니다. 개별 구성 파일은 여전히 ​​존재하지만 자동으로 재생성됩니다.매번 마스터를 바꾸세요.

master.conf모든 섹션, 하위 섹션 등을 포함하는 "기본" 프로필이 있습니다. inotify스크립트가 변경되면 해당 파일을 모두 다시 쓰 도록 스크립트를 설정합니다 . (경합 조건을 피하기 위해 파일을 하위 디렉터리에 저장하고 디렉터리를 교체하여 "커밋"을 수행하는 등 몇 가지 추가 트릭을 수행할 수 있습니다.)

~에서https://stackoverflow.com/q/5316178/3849157기본 Perl 스크립트를 얻습니다.

my $inotify = Linux::Inotify2->new;
$inotify->watch("/etc/master.conf", IN_MODIFY);
while () {
  my @events = $inotify->read;
  unless (@events > 0){
    print "read error: $!";
    last ;
  }

  foreach my $event (@events) {
    next unless $event->IN_MODIFY;
    # 1. TODO: RE-READ IN THE CONFIG FILE
    # (example)
    $config_hash = &parse_master_file;

    # 2. TODO: RE-GENERATE YOUR CONFIG FILES
    # (example)
    for $section qw( section1 section2 misc ) {
        open(S,"> /etc/${section}.conf")
        print S &dump_config($config_hash,$section)
        close(S)
    }
  }
}

실행은 당신에게 달려 parse_master_file있습니다 . dump_config또한 메인 루프에서 sleep을 호출해야 할 수도 있습니다. 그렇지 않으면 CPU에 불이 붙을 것입니다.

답변2

이러한 모든 파일을 읽는 응용 프로그램/프로그램이 있고 .conf, 프로그램에서 선택한 파일 이름에 대한 적절한 정보를 동적으로 내보내는 하나의 파일로 모든 파일을 병합하려고 합니다. 파이프 기반 솔루션의 문제점은 파이프를 제공하는 프로그램이 소비자가 열었거나 읽으려는 파일을 감지할 수 없다는 것입니다. 그래서 다른 방법이 필요합니다.

다른 영역의 실망스러운 문제를 해결하는 다른 영역의 잘 알려지지 않은 솔루션: rpm을 빌드할 때 최종 패키징 단계에서 몇 가지 사소한 문제를 해결하기 위해 rpmbuild 프로세스를 단축해야 합니다. 이 spec파일에는 우리가 만들고 있는 RPM과 관련된 여러 "섹션"(준비, 빌드, 파일)이 있습니다. 프로그램이 빌드되었지만 파일 섹션에 일부 오류가 있는 경우 rpmbuild가 재컴파일을 건너뛰기를 원합니다. 하지만 설계상으로는 그렇게 되지 않습니다.

LD_PRELOAD어떤 사람들은 호출을 캡처하기 위해 특별히 설계된 so/dll 파일을 로드하는 데 사용할 수 있다는 것을 발견했습니다 open. open사양 파일을 호출하는 경우 files해당 섹션을 제외한 모든 항목에 대해 빈 항목을 제공 하므로 rpmbuild파일을 읽을 때 실제로 DLL이 알려주는 내용을 읽습니다.

몇 주 동안 사용했는데 어느 순간 가상 머신을 지우고, 프로그램을 존재에서 삭제하고, 다시는 찾을 수 없게 되었습니다. :( .라는 프로그램이 mock지금 이 작업을 수행하지만 동일한 방식으로 수행하는지 아니면 다른 방법을 사용하는지 모르겠습니다.

그러나 그것은 아이디어입니다. LD_PRELOAD를 통해 로드할 수 있는 DLL을 생성하고 open프로그램 호출을 무시하되 관심 없는 파일(실제 파일)에 호출을 전달해야 합니다. 관심 있는 파일의 경우 마스터 파일에서 찾아서 병합한 데이터를 제공합니다.

복잡하게 들리나요? 네 ... 조금. 좋은 점은 매우 불쾌한 루트킷과 트로이 목마를 생성할 수 있는 도구를 갖게 된다는 것입니다.

ltrace -e open <program>이것이 작동하는지 확인하려면 다음 명령을 사용하여 프로그램을 실행하십시오.

ltrace -e open /usr/bin/tail /etc/fstab

다음과 같은 출력이 표시됩니다.

(0, 0, 0, 0x7f1c32ade000, 88)                             = 0x3055621160
open("/etc/fstab", 0, 00)                             = 4

프로그램이 glibc를 사용하여 이러한 파일을 여는 한(직접 시스템 호출이 아닌) 위의 출력에서 ​​이를 볼 수 있으며 괜찮을 것입니다.

다음 단계: 누군가자세한 설명ioctl호출을 무시하는 방법 . 이렇게 하면 순조롭게 진행됩니다.여기에 아주 좋은 튜토리얼이 있습니다.

답변3

제안된 솔루션은 프로덕션 용도로 사용하기에는 너무 이상합니다.

실제로, inotify 접근 방식(기본 구성이 수정된 후 파일이 명시적으로 재생성됨)에 문제가 없는 것 같으므로 간단한 스크립트를 사용하여 모든 쓰레기를 재생성할 수 있습니다. 여기서는 기능 손실 없이 inotify를 피할 수 있습니다. 장점은 디버깅할 항목이 적고 백그라운드에서 프로세스를 처리할 필요가 없다는 것입니다.

lulz의 경우 문제의 기능을 구현하는 것이 가능하지만 그렇게 할 이유가 없다는 점에 유의해야 합니다. 문제는 다음과 같습니다: 특수 파일 시스템(예: 퓨즈 기반) 등 - 열기, 읽기 등 이러한 파일을 작업하는 사람이 발행한 루틴은 결국 귀하의 코드를 호출하므로 원하는 것은 무엇이든 피드백할 수 있습니다. 그런데 또 도대체 왜 그런 짓을 하려는 걸까요?

관련 정보