最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Shell腳本生成配置文件的6種方法

 更新時間:2025年12月31日 09:08:25   作者:大聰明-PLUS  
根據(jù)模板準備配置文件是一項非常常見的系統(tǒng)管理任務,實現(xiàn)此任務的方法有很多種,每種方法都有其自身的優(yōu)勢,本文將介紹如何使用 shell 腳本來完成此操作,需要的朋友可以參考下

學習任務

我們將以解決一個典型問題為例進行研究,該問題需要創(chuàng)建一個 shell 腳本來生成包含節(jié)點網(wǎng)絡堆棧設置的配置文件。我們假設待配置的節(jié)點只有一個名為“ens33”的網(wǎng)絡接口。該腳本必須允許指定靜態(tài) IP 地址、子網(wǎng)掩碼和默認網(wǎng)關。

基于以上考慮,我們得到以下配置文件模板:

自動 ens33
接口 ens33 inet 靜態(tài)
地址IP_ADDRESS_VALUE
子網(wǎng)掩碼NETMASK_VALUE
網(wǎng)關DEFAULT_GATEWAY_VALUE

為了進一步舉例說明,我們假設 IP 地址設置為 192.168.0.10,子網(wǎng)掩碼設置為 255.255.255.0,默認網(wǎng)關設置為 192.168.0.1。

選項 1. 將模板放置在腳本中,使用標準工具生成輸出

解決這個問題的最簡單方法(新手開發(fā)者經(jīng)常使用的方法)是將模板放在腳本主體中,并使用局部變量作為占位符值。

#!/bin/bash
 
IP="192.168.0.10"
NETMASK="255.255.255.0"
GATEWAY="192.168.0.1"
 
TEMPLATE="$(
cat << EOF
auto ens33
iface ens33 inet static
address $IP
netmask $NETMASK
gateway $GATEWAY
EOF
)"
 
echo -e "$TEMPLATE"

腳本的運行結(jié)果(以及所有后續(xù)腳本的運行結(jié)果)將如下所示:

自動 ens33
接口 ens33 inet 靜態(tài)
地址 192.168.0.10
子網(wǎng)掩碼 255.255.255.0
網(wǎng)關 192.168.0.1

這個方案各方面都很好,唯一的不足之處在于,修改模板時可能出現(xiàn)的人為錯誤(例如拼寫錯誤或其他錯誤)會導致腳本“崩潰”。因此,更合理的架構(gòu)方案是將腳本和模板分別放在不同的文件中。

細心的讀者可能會注意到,我們在腳本主體中設置了變量值,這意味著要生成具有不同設置的下一個配置文件,仍然需要修改腳本。沒錯,確實如此,但這是為了簡化操作而有意為之。當然,我們完全可以擴展腳本,例如,添加一個用戶界面,讓用戶可以通過控制臺輸入變量值。

選項 2. 將模板放在外部文件中,并使用 envsubst 填充它

讓我們創(chuàng)建一個名為“template.txt”的模板文件,內(nèi)容如下:

自動 ens33
接口 ens33 inet 靜態(tài)
地址 $IP
子網(wǎng)掩碼 $NETMASK
網(wǎng)關 $GATEWAY

#!/bin/bash
 
export IP="192.168.0.10"
export NETMASK="255.255.255.0"
export GATEWAY="192.168.0.1"
 
envsubst  < template.txt

選項 3. 將模板放在外部文件中,并使用 sed 工具填充它。

該工具sed允許您將字符串相互替換。為了避免重寫模板,我們將搜索與變量名($IP、$NETMASK、$GATEWAY)對應的字符串,并將其替換為相應的值。請注意,要搜索字符串“$IP”,我們需要轉(zhuǎn)義“$”字符,并搜索字符串“\$IP”(其他變量也適用相同的規(guī)則)。

#!/bin/bash
 
IP="192.168.0.10"
NETMASK="255.255.255.0"
GATEWAY="192.168.0.1"
 
cat template.txt | sed "s/\$IP/$IP/" |
                sed "s/\$NETMASK/$NETMASK/" |
                sed "s/\$GATEWAY/$GATEWAY/"

選項 4. 將模板放在外部文件中,并使用 awk 填充它

這個選項在概念上與前一個選項類似,只是sed我們用代替awk,這會稍微影響腳本列表。

#!/bin/bash
 
IP="192.168.0.10"
NETMASK="255.255.255.0"
GATEWAY="192.168.0.1"
 
cat template.txt |
 awk -v replace_str="$IP"      '{ gsub( /\$IP/ ,      replace_str ); print }' |
 awk -v replace_str="$NETMASK" '{ gsub( /\$NETMASK/ , replace_str ); print }' |
 awk -v replace_str="$GATEWAY" '{ gsub( /\$GATEWAY/ , replace_str ); print }'

選項 5. 將模板放在外部文件中,并使用 eval 函數(shù)填充它

此選項與之前的選項不同之處在于,它不使用任何外部工具,而只使用內(nèi)置命令eval。用于生成模板的腳本eval如下所示:

#!/bin/bash
 
IP="192.168.0.10"
NETMASK="255.255.255.0"
GATEWAY="192.168.0.1"
 
TEMPLATE=$(< template.txt)
 
eval "echo -e \"$TEMPLATE\""

你可能想知道我們?yōu)槭裁葱枰?code>eval?這個例子會幫助你理解:

#!/bin/bash
 
VAR="A"
 
TEMPLATE_LOCAL="VAR=$VAR"
TEMPLATE_FILE="$( < template_file.txt)"
 
# VAR=$VAR
 
echo -e "$TEMPLATE_LOCAL"
 
# VAR=A
echo -e "$TEMPLATE_FILE"
 
# VAR=$VAR
eval "echo -e \"$TEMPLATE_FILE\""

如您所見,eval這使您能夠克服 Shell 的一些特性,這些特性會導致腳本對同一數(shù)據(jù)的解釋因數(shù)據(jù)是在腳本主體中指定還是從外部文件加載而有所不同?,F(xiàn)在讓我們來談談使用此功能提供的特性和功能eval。

首先需要注意的是,需要在模板文件中轉(zhuǎn)義特殊字符。例如,`" " "` 應替換為 `" \"`。

使用此功能的第二個特性eval是能夠在模板中編寫代碼。這使您可以構(gòu)建復雜的模板,這些模板不僅可以替換值,還可以根據(jù)指定的條件輸出(或不輸出)整個部分。

為了演示此功能,我們將通過添加一個可選的第二個接口設置“ens37”來使我們的教程更加復雜。這意味著“ens33”將始終配置,而“ens37”僅在必要時配置。使用后,eval配置文件模板(eval_template.txt)將如下所示:

auto ens33
iface ens33 inet static
address $ENS33_IP
netmask $ENS33_NETMASK
gateway $ENS33_GATEWAY

$(
if [[ (-n ${ENS37_IP}) && (-n ${ENS37_NETMASK}) ]]; then
cat << EOF
auto ens37
iface ens37 inet static
address $ENS37_IP
netmask $ENS37_NETMASK
EOF
fi
)

我們將對之前編寫的腳本進行一些關于變量名稱的細微修改。除此之外,所有內(nèi)容基本保持不變。

#!/bin/bash
 
ENS33_IP="192.168.0.10"
ENS33_NETMASK="255.255.255.0"
ENS33_GATEWAY="192.168.0.1"
 
ENS37_IP="10.0.0.10"
ENS37_NETMASK="255.255.0.0"
 
TEMPLATE=$(< eval_template.txt)
 
eval "echo -e \"$TEMPLATE\""

腳本運行結(jié)果:

自動配置 ens33
接口 ens33 inet 靜態(tài)
地址 192.168.0.10
子網(wǎng)掩碼 255.255.255.0
網(wǎng)關 192.168.0.1

自動配置 ens37
接口 ens37 inet 靜態(tài)
地址 10.0.0.10
子網(wǎng)掩碼 255.255.0.0

除了潛在的風險之外,在模板中編寫代碼也存在風險。攻擊者可以秘密修改模板,添加惡意代碼,這些代碼會在生成下一個配置文件時執(zhí)行。你非但無法通過自動化日常任務來簡化工作,反而會面臨清理黑客攻擊后果的棘手問題。

在上面的例子中,模板文件非常小,可以快速掃描(經(jīng)過適當?shù)挠柧殻?。但如果模板很大,幾乎不可能找到惡意代碼。而且,不斷檢查模板是否存在未經(jīng)授權(quán)的修改本身就是一個糟糕的主意。

選項 6. 將模板放在外部文件中,并使用 Bash 的內(nèi)置功能填充它

另一個純粹的 Shell 變體,其理念與awk或類似。只是這里我們使用shell的內(nèi)置工具sed進行字符串搜索和替換。

#!/bin/bash
 
IP="192.168.0.10"
NETMASK="255.255.255.0"
GATEWAY="192.168.0.1"
 
TEMPLATE="$(< template.txt)"
 
TEMP="${TEMPLATE/\$NETMASK/$NETMASK}"
TEMP="${TEMP/\$IP/$IP}"
TEMP="${TEMP/\$GATEWAY/$GATEWAY}"
 
echo -e "$TEMP"

結(jié)論

我們已經(jīng)了解了六種使用 Shell 腳本構(gòu)建配置文件的方法。你應該選擇哪一種呢?當然是選擇你最喜歡的!

在其他條件相同的情況下,可以考慮envsubst使用 `shell` 腳本。它解決了基本問題,而且使用起來非常簡潔。但是,出于eval安全考慮,最好避免使用它。

相關文章

  • Linux系統(tǒng)links和elinks命令的基本使用教程

    Linux系統(tǒng)links和elinks命令的基本使用教程

    links和elinks都是Linux系統(tǒng)下的命令行瀏覽器,主要用于在終端中查看網(wǎng)頁內(nèi)容,這篇文章主要介紹了Linux系統(tǒng)之links和elinks命令的基本使用,需要的朋友可以參考下
    2023-09-09
  • Spark-shell批量命令執(zhí)行腳本的方法

    Spark-shell批量命令執(zhí)行腳本的方法

    今天小編就為大家分享一篇Spark-shell批量命令執(zhí)行腳本的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Linux換行符的使用方法詳解

    Linux換行符的使用方法詳解

    本文介紹了Linux中常用的換行符LF及其在文件中的表示,展示了如何使用sed命令替換換行符,并列舉了與換行符處理相關的Linux命令,通過代碼講解的非常詳細,需要的朋友可以參考下
    2025-04-04
  • shell腳本之sed詳細用法詳解

    shell腳本之sed詳細用法詳解

    Sed是一個非交互性文本流編輯器,它編輯文件或標準輸入導出的文本拷貝,vi中的正則表達式命令在sed中大多可以通用,下面這篇文章主要給大家介紹了關于shell腳本之sed詳細用法的相關資料,需要的朋友可以參考下
    2022-07-07
  • bash shell的條件語句詳解

    bash shell的條件語句詳解

    文章主要介紹了bash shell中的條件語句,包括if-then-fi、else、elif等結(jié)構(gòu)的使用規(guī)則,以及條件判斷符號(如-eq、-lt等)的正確使用方法,感興趣的朋友一起看看吧
    2024-12-12
  • Linux awk將文件某列按照逗號分隔的例子

    Linux awk將文件某列按照逗號分隔的例子

    今天小編就為大家分享一篇關于Linux awk將文件某列按照逗號分隔的例子,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Shell腳本實現(xiàn)監(jiān)控磁盤、CPU、內(nèi)存占用情況

    Shell腳本實現(xiàn)監(jiān)控磁盤、CPU、內(nèi)存占用情況

    CPU、內(nèi)存和磁盤是計算機中重要且相互依賴的組件,這篇文章主要為大家詳細介紹了如何通過shell實現(xiàn)如何監(jiān)控他們的使用情況,感興趣的可以了解下
    2023-09-09
  • Linux命令之tail的使用及應用場景介紹

    Linux命令之tail的使用及應用場景介紹

    tail 是一條在 Linux 系統(tǒng)中常用的命令行工具,用來顯示文件的末尾內(nèi)容,tail 的功能強大且簡潔,能夠滿足多種應用需求本文就給大家介紹一下Linux命令tail的使用及應用場景,需要的朋友可以參考下
    2023-09-09
  • Shell腳本實現(xiàn)亂序排列文件內(nèi)容的多種方法(洗牌問題)

    Shell腳本實現(xiàn)亂序排列文件內(nèi)容的多種方法(洗牌問題)

    這篇文章主要介紹了Shell腳本實現(xiàn)亂序排列文件內(nèi)容的多種方法(洗牌問題),本文給出3個Shell腳本和一個Python腳本解決亂序排列文件內(nèi)容問題,需要的朋友可以參考下
    2015-01-01
  • linux上配置jdk時,java命令提示沒有此文件或文件夾的解決方法

    linux上配置jdk時,java命令提示沒有此文件或文件夾的解決方法

    下面小編就為大家?guī)硪黄猯inux上配置jdk時,java命令提示沒有此文件或文件夾的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論

黄龙县| 广丰县| 高碑店市| 阿拉尔市| 靖江市| 沿河| 库车县| 通化县| 祁东县| 山东省| 常宁市| 盐池县| 鄄城县| 甘谷县| 青州市| 长岛县| 阿鲁科尔沁旗| 花莲县| 锡林郭勒盟| 齐河县| 荣昌县| 连城县| 云龙县| 平武县| 开平市| 新丰县| 白银市| 江津市| 云龙县| 谢通门县| 东乌珠穆沁旗| 黄平县| 盐池县| 沙河市| 阳山县| 无锡市| 和平区| 桑日县| 区。| 界首市| 龙陵县|