Linux

如何使用相同的值填充許多配置文件

  • March 18, 2019

我有很多程序,它們的配置文件中都有一些相同的值(如果不是全部的話,大多數都在/etc.

假設它是主機名,它儲存在 Apache、Postfix、SQL、clamAV 等的配置文件中……有時我需要更改這些值。我現在要做的是編輯所有這些文件並用新值查找並替換以前的值。

我想在一個地方更改它,並正確設置所有這些文件。我想到了 bash 的export變數、source命令或類似的東西;但是,由於配置文件不可執行,我認為它不會起作用。

推薦的方法是什麼?

顯然,您必須確定要管理的所有參數以及它們出現的所有位置。  (呃。)  你已經知道了。

這是一種可能使您走上正軌的方法:

  1. 選擇一個永遠不會出現在某個配置文件中的字元串。(這聽起來像是您必須在第一次嘗試時就正確。這不是真的;如果您選擇了一個字元串(例如,@@)並且您稍後需要在其中一個文件中使用該字元串,您可以修復它。您只需要重做很多此設置。)

例如,很久以前,Unix 有一個版本控制系統,稱為原始碼控制系統(SCCS);它將字元串@(#)用作永遠不會自然出現在文件中的字元串。據我所知,SCCS 不再使用了(至少,不多),所以應該可以安全使用@(#). 或者您可以使用類似!user2461440?的名稱,或者您的真實姓名。您可以包括控製字元;例如,Ctrl+ACtrl+ G。 2. 選擇參數佔位符的命名約定。這可能是簡單明了的東西,例如@(#){HOSTNAME}, @(#){IP},@(#){GATEWAY}等。 3. 創建所有配置文件的模板版本,例如apache.template等。編輯這些模板以將所有出現的要操作的參數替換為相應的參數佔位符(來自上一段)。您應該將這些(以及以下內容)放在安全、偏僻的地方,例如/root. 4. 寫一個這樣的腳本:

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}使用$LOG 不同的分隔符 ( |),因為該$LOG值包含/s。因此請注意,@(#)字元串不得包含此分隔符 ( |)。(當然,它不能包含標準 ( /) 分隔符。) 5. 數組(例如,fullpath[apache])並非在所有 shell 中都有效。如果您沒有 bash 或其他支持數組的 shell,則需要調整腳本以模擬或解決它們。 6. 您可能需要在腳本中添加chownchmod命令以正確設置文件的系統屬性。或者,如果你真的確定你的腳本工作正常,你可以修改它以覆蓋文件,如

   sed  …      > "$path"

從而保留inode及其屬性,而不是使用mv命令或.newand.bak文件。 7. 當您想要更改您選擇自動執行的參數之一時,請HOST=Wonderland在腳本開頭編輯相應的賦值語句(例如 )。如果您不想編輯腳本,請將腳本分成兩個文件:一個包含參數值(HOST=…IP=…等…),另一個負責配置文件的所有處理。第二個腳本將source第一個獲取參數值。這樣,當參數值更改時,您只需編輯包含這些值的(腳本)文件,而不是主腳本。 8. 確保不要手動編輯文件,因為這些更改將在您下次執行參數化腳本時被覆蓋。相反,編輯相應的模板文件並重新執行腳本。您可能希望在文件中添加註釋以提醒您這一點。(如果您不喜歡為僅影響其中一個的更改重新生成所有配置文件的想法,您可以修改腳本,使其能夠僅重新生成選定的文件。)

引用自:https://unix.stackexchange.com/questions/368367