Linux下使用makeself製作一鍵安裝包

fanhaixin發表於2024-12-05

Linux下使用makeself製作一鍵安裝包

下載makeself

yum -y install makeself

makeself 命令和引數

makeself.sh --gzip . <output_file.run> "<display_name>" <startup_script>
  • . 表示當前目錄,這樣 makeself 將會打包當前目錄下的所有檔案和子目錄。該目錄最好使用絕對路徑

  • output_file.run: 生成的自解壓指令碼的輸出檔名。

  • "display_name": 在指令碼執行時顯示的名稱。

  • startup_script (可選): 在解壓後執行的啟動指令碼。包括shell 和 python 等

  • 注 --gzip 可不指定 是預設的壓縮和解壓演算法 可指定其他演算法

準備環境與指令碼

[root@zookeeper1 ~/fire]#pwd
/root/fire


[root@zookeeper1 ~/fire]#ll
total 472
-rwxr-xr-x 1 root root   2349 Nov 10 21:39 add_iptables_rules.sh
-rw-r--r-- 1 root root  76116 Aug 10  2017 dos2unix-6.0.3-7.el7.x86_64.rpm
-rw-rw-rw- 1 root root     91 Nov 10 16:37 ip_list.txt
-rw-r--r-- 1 root root  53704 Oct 15  2020 iptables-services-1.4.21-35.el7.x86_64.rpm

下載了相關rpm包和shell指令碼

需要將上述的rpm包和shell指令碼打包成為一鍵安裝包.run

makeself 目錄路徑 打包成的.run檔名  "顯示名稱"  ./add_iptables_rules.sh(執行指令碼)

[root@zookeeper1 ~/fire]#makeself ~/fire fire.run "新增防火牆規則" ./add_iptables_rules.sh 

# 將家目錄下的fire目錄打包成為  fire.run 檔案
add_iptables_rules.sh 是執行指令碼  內容如下

add_iptables_rules.sh指令碼內容

  • 此指令碼是從ip_list.txt檔案中讀取ip 並使用iptables 新增防火牆規則,旨在允許ip_list.txt
  • 中的ip訪問 其餘ip全部拒絕
  • 包含iptables安裝啟動 一整套的流程 只需要更改的ip_list.txt的ip地址即可
#!/bin/bash

# 指定儲存 IP 列表的檔名
IP_FILE="ip_list.txt"

# 關閉 firewalld 服務
systemctl stop firewalld
systemctl disable firewalld

# 定義一個函式用於安裝本地 RPM 並檢查結果
install_rpm() {
   local package="$1"
   local rpm_file="$2"

   if rpm -qa | grep -qw "$package"; then
       echo "$package 已經成功安裝"
   else
       echo "正在安裝 $package"
       if rpm -ivh "$rpm_file"; then
           echo "$package 安裝成功"
       else
           echo "無法安裝 $package:出現未知錯誤" >&2
           exit 1
       fi
   fi
}

# 安裝所需的軟體包
install_rpm "iptables-services" "iptables-services-1.4.21-35.el7.x86_64.rpm"
install_rpm "dos2unix" "dos2unix-6.0.3-7.el7.x86_64.rpm"


# 新增防火牆核心模組到核心中
echo "載入 iptables 模組"
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

# 設定系統在啟動時載入這些模組
echo "確保系統在啟動時載入這些模組"
cat <<EOF | sudo tee -a /etc/rc.d/rc.local
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF

# 賦予 rc.local 檔案執行許可權
chmod +x /etc/rc.d/rc.local

# 啟動並啟用 iptables 服務
systemctl start iptables
systemctl enable iptables

iptables -F
iptables -X
iptables -Z

# 校正ip_list檔案格式,確保結尾為 \n
dos2unix $IP_FILE

# 檢查檔案是否存在
if [[ ! -f "$IP_FILE" ]]; then
   echo "IP 地址檔案 '$IP_FILE' 未找到!" >&2
   exit 1
fi



# 為每個 IP 生成 iptables 規則
while IFS= read -r ip; do
   # 忽略空行和以 # 開頭的註釋行
   if [[ -z "$ip" || "$ip" == \#* ]]; then
       continue
   fi

   # 為讀取的每個 IP 地址插入一條允許規則
   iptables -I INPUT -s "$ip" -j ACCEPT
   echo "已插入規則以接受來自 $ip 的流量"

done < "$IP_FILE"

# 插入全域性拒絕所有其他入站流量的規則
iptables -P INPUT DROP
echo "所有指定的 iptables 規則已更新。"

# 儲存並重啟 iptables 服務以確保規則生效
# iptables-save > /etc/sysconfig/iptables
# systemctl restart iptables

相關文章