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