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

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

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

學(xué)習(xí)任務(wù)

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

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

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

為了進(jìn)一步舉例說(shuō)明,我們假設(shè) IP 地址設(shè)置為 192.168.0.10,子網(wǎng)掩碼設(shè)置為 255.255.255.0,默認(rèn)網(wǎng)關(guān)設(shè)置為 192.168.0.1。

選項(xiàng) 1. 將模板放置在腳本中,使用標(biāo)準(zhǔn)工具生成輸出

解決這個(gè)問(wèn)題的最簡(jiǎn)單方法(新手開發(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"

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

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

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

細(xì)心的讀者可能會(huì)注意到,我們?cè)谀_本主體中設(shè)置了變量值,這意味著要生成具有不同設(shè)置的下一個(gè)配置文件,仍然需要修改腳本。沒(méi)錯(cuò),確實(shí)如此,但這是為了簡(jiǎn)化操作而有意為之。當(dāng)然,我們完全可以擴(kuò)展腳本,例如,添加一個(gè)用戶界面,讓用戶可以通過(guò)控制臺(tái)輸入變量值。

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

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

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

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

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

該工具sed允許您將字符串相互替換。為了避免重寫模板,我們將搜索與變量名($IP、$NETMASK、$GATEWAY)對(duì)應(yīng)的字符串,并將其替換為相應(yīng)的值。請(qǐng)注意,要搜索字符串“$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/"

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

這個(gè)選項(xiàng)在概念上與前一個(gè)選項(xiàng)類似,只是sed我們用代替awk,這會(huì)稍微影響腳本列表。

#!/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 }'

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

此選項(xiàng)與之前的選項(xiàng)不同之處在于,它不使用任何外部工具,而只使用內(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?這個(gè)例子會(huì)幫助你理解:

#!/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\""

如您所見(jiàn),eval這使您能夠克服 Shell 的一些特性,這些特性會(huì)導(dǎo)致腳本對(duì)同一數(shù)據(jù)的解釋因數(shù)據(jù)是在腳本主體中指定還是從外部文件加載而有所不同?,F(xiàn)在讓我們來(lái)談?wù)勈褂么斯δ芴峁┑奶匦院凸δ?code>eval。

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

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

為了演示此功能,我們將通過(guò)添加一個(gè)可選的第二個(gè)接口設(shè)置“ens37”來(lái)使我們的教程更加復(fù)雜。這意味著“ens33”將始終配置,而“ens37”僅在必要時(shí)配置。使用后,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
)

我們將對(duì)之前編寫的腳本進(jìn)行一些關(guān)于變量名稱的細(xì)微修改。除此之外,所有內(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\""

腳本運(yùn)行結(jié)果:

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

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

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

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

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

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

#!/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)建配置文件的方法。你應(yīng)該選擇哪一種呢?當(dāng)然是選擇你最喜歡的!

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

相關(guān)文章

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

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

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

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

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

    Linux換行符的使用方法詳解

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

    shell腳本之sed詳細(xì)用法詳解

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

    bash shell的條件語(yǔ)句詳解

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

    Linux awk將文件某列按照逗號(hào)分隔的例子

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

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

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

    Linux命令之tail的使用及應(yīng)用場(chǎng)景介紹

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

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

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

    linux上配置jdk時(shí),java命令提示沒(méi)有此文件或文件夾的解決方法

    下面小編就為大家?guī)?lái)一篇linux上配置jdk時(shí),java命令提示沒(méi)有此文件或文件夾的解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05

最新評(píng)論

馆陶县| 垦利县| 临澧县| 江达县| 色达县| 韩城市| 汉阴县| 喀什市| 共和县| 深水埗区| 鞍山市| 开鲁县| 随州市| 察隅县| 碌曲县| 长子县| 清涧县| 田林县| 冕宁县| 鹤峰县| 新巴尔虎左旗| 镇原县| 屯门区| 龙门县| 芒康县| 清涧县| 横峰县| 连江县| 云和县| 兴化市| 筠连县| 泰宁县| 西昌市| 高青县| 桑日县| 扶余县| 隆安县| 拜城县| 盱眙县| 吉木萨尔县| 望城县|