나는 많은 프로그램을 갖고 있고, 그 모든 프로그램은 구성 파일에 동일한 값을 가지고 있습니다(대부분은 전부는 아니지만 /etc
).
Apache, Postfix, SQL, clamAV 등에 대한 구성 파일에 저장된 호스트 이름이라고 가정해 보겠습니다. 때때로 이러한 값을 변경해야 합니다. 지금 해야 할 일은 이 파일들을 모두 편집하고 이전 값을 찾아 새 값으로 바꾸는 것입니다.
한 곳에서 변경하고 모든 파일을 올바르게 설정하고 싶습니다. 나는 bash export
변수, 명령 또는 이와 유사한 것을 생각했지만 source
구성 파일은 실행 가능하지 않기 때문에 작동하지 않을 것이라고 생각합니다.
권장되는 접근 방식은 무엇입니까?
답변1
당연히 관리하려는 모든 매개변수와 매개변수가 발생하는 모든 위치를 식별해야 합니다. (Duh.) 당신은 이미 그것을 알고 있었죠.
다음 방법을 사용하면 올바른 경로로 이동할 수 있습니다.
구성 파일 중 하나에 나타나지 않는 문자열을 선택하십시오. (이거 너 같은데~ 해야 하다첫 번째 시도에서 바로 알아보세요. 그러나 실제로는 그렇지 않습니다. 문자열(예:
@@
)을 선택하고 나중에 파일 중 하나에서 해당 문자열을 사용해야 하는 경우 이 문제를 해결할 수 있습니다. 많은 설정을 다시 실행하면 됩니다. )예를 들어, 오래 전에 Unix에는 소스 코드 제어 시스템(SCCS)이라는 버전 제어 시스템이 있었는데, 이는
@(#)
파일에 자연적으로 나타나지 않는 문자열을 사용했습니다. 내가 아는 한 SCCS는 더 이상(적어도 많이는) 사용되지 않으므로 안전하게 사용할 수 있습니다@(#)
. 또는 과 같은!user2461440?
이름을 사용하거나 실명이 무엇이든 사용할 수 있습니다 . Ctrl+ A또는 Ctrl+ 등의 제어 문자를 포함할 수 있습니다 G.매개변수 자리 표시자의 명명 규칙을 선택합니다. 이는 ,,,
@(#){HOSTNAME}
등과 같이 간단하고 간단한 것일 수 있습니다.@(#){IP}
@(#){GATEWAY}
모든 구성 파일의 템플릿 버전을 생성합니다
apache.template
. 이러한 템플릿을 편집하여 조작할 매개변수의 모든 발생을 해당 매개변수 자리 표시자(이전 단락의)로 바꾸십시오. 이러한 것(및 다음 항목)을 안전하고 방해가 되지 않는 곳에 보관해야 합니다/root
.다음과 같은 스크립트를 작성하세요.
HOST=Zanzibar IP=10.11.12.42 ︙ LOG=/var/log/lumber ︙ fullpath[apache]=/etc/apache.conf fullpath[postfix]=/etc/postfix/configuration ︙ for file in apache postfix … do path=${fullpath[$file]} sed -e "s/@(#){HOSTNAME}/$HOST/g" \ -e "s/@(#){IP}/$IP/g" \ ︙ -e "s|@(#){LOG}|$LOG|g" \ ︙ "$file.template" > "$path.new" && mv "$path" "$path.bak" && mv "$path.new" "$path" done
@(#){LOG}
로 대체된 하위 명령은 값에 s가 포함되어 있으므로$LOG
다른 구분 기호(|
)를 사용합니다 . 따라서 문자열에는 이 구분 기호( )가 포함되어서는 안 됩니다. (물론, 표준( ) 구분자를 포함할 수 없습니다.)$LOG
/
@(#)
|
/
배열(예:
fullpath[apache]
)은 모든 셸에서 유효하지 않습니다. bash나 배열을 지원하는 다른 셸이 없는 경우 이를 에뮬레이트하거나 해결하도록 스크립트를 조정해야 합니다.chown
파일의 시스템 속성을 적절하게 설정하려면 스크립트에 및 명령을 추가해야 할 수도 있습니다 .chmod
아니면 정말로진짜스크립트가 제대로 작동하는지 확인하세요. 스크립트를 수정하여 다음과 같은 적절한 파일을 덮어쓸 수 있습니다.sed … > "$path"
이는 inode와 해당 속성을 유지하며 명령
mv
이나.new
파일을 사용하지 않습니다.bak
.자동화하도록 선택한 매개변수 중 하나를 변경하려면
HOST=Wonderland
스크립트 시작 부분에서 해당 지정 문을 편집합니다(예: ). 스크립트를 편집하지 않으려면 스크립트를 두 개의 파일로 분할하십시오. 하나는 매개변수 값(HOST=…
,IP=…
etc...)을 포함하고 다른 하나는 구성 파일의 모든 처리를 수행합니다. 두 번째 스크립트는source
매개변수 값을 얻는 첫 번째 스크립트가 됩니다 . 이렇게 하면 매개변수 값이 변경될 때 메인 스크립트가 아닌 해당 값이 포함된 (스크립트) 파일만 편집하면 됩니다.다음에 매개변수화된 스크립트를 실행할 때 이러한 변경 사항을 덮어쓰게 되므로 파일을 수동으로 편집하지 마십시오. 대신 해당 템플릿 파일을 편집하고 스크립트를 다시 실행하십시오. 이를 상기시키기 위해 파일에 설명을 추가할 수 있습니다. (프로필 중 하나에만 영향을 미치는 변경 사항에 대해 모든 프로필을 다시 생성하는 아이디어가 마음에 들지 않으면 선택한 파일만 다시 생성하도록 스크립트를 수정할 수 있습니다.)