Shell 腳本中的網路操作技巧
在日常系統管理與自動化任務中,Shell 腳本往往需要與網路進行互動。無論是檢查服務狀態、下載檔案、監控連線品質,還是透過 API 獲取資訊,掌握 Shell 中的網路操作技巧都是提升工作效率的關鍵。這篇文章將介紹幾個在 Ubuntu 22.04 與 Debian 12 上最實用的網路操作技巧,幫助你撰寫更健壯的自動化腳本。
使用 curl 與 wget 進行 HTTP 請求
curl 和 wget 是 Linux 世界中最經典的網路傳輸工具。對於腳本開發者而言,curl 因其強大的參數控制和 JSON 輸出能力,通常更受歡迎。
檢查服務可用性
我們經常需要確認某個遠端服務是否在線。以下範例使用 curl 發送請求,並透過 exit code 判斷服務狀態:
#!/bin/bash
URL="https://www.google.com"
# 使用 --max-time 設定超時時間為 5 秒
# -s 靜默模式,-o /dev/null 丟棄輸出內容,僅保留 exit code
if curl -s --max-time 5 -o /dev/null "$URL"; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 服務正常"
else
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 服務連線失敗"
exit 1
fi
這段程式碼簡單卻極其重要。透過 -s 參數隱藏進度條,讓輸出更乾淨;-o /dev/null 則避免將網頁內容寫入記憶體或檔案,節省資源。
下載檔案並處理錯誤
若需下載檔案,wget 的 -q(靜默)與 -O(指定輸出檔)組合非常實用。以下範例示範如何下載檔案並驗證其存在:
#!/bin/bash
DOWNLOAD_URL="https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.1.tar.xz"
OUTPUT_FILE="/tmp/linux.tar.xz"
# -q: 靜默模式
# -O: 指定輸出檔案名稱
# --tries=3: 失敗重試 3 次
if wget -q -O "$OUTPUT_FILE" --tries=3 "$DOWNLOAD_URL"; then
if [ -f "$OUTPUT_FILE" ]; then
echo "下載成功,檔案大小:$(du -h "$OUTPUT_FILE" | cut -f1)"
else
echo "下載檔案不存在"
exit 1
fi
else
echo "下載失敗"
exit 1
fi
使用 ping 與 nc 進行基礎網路偵測
除了 HTTP 層級,有時我們需要更底層的網路狀態檢查。
主機存活偵測 (Ping)
ping 是最基礎的连通性測試。在腳本中,我們通常只關心結果,不想要大量的輸出。
#!/bin/bash
HOST="8.8.8.8"
COUNT=2
# -c 指定次數,-W 指定超時秒數
if ping -c $COUNT -W 2 "$HOST" > /dev/null 2>&1; then
echo "$HOST 可以連線"
else
echo "$HOST 無法連線"
fi
注意這裡將 stdout 和 stderr 都導向 /dev/null,這樣腳本執行時不會在終端顯示 ping 的統計資訊,保持介面乾淨。
檢查埠口是否開啟 (Netcat)
nc (Netcat) 可以用來測試特定埠口是否監聽中。這對於檢查資料庫或 Web 伺服器是否啟動非常有用。
#!/bin/bash
HOST="localhost"
PORT=22
# -z: 零 I/O 模式,用於掃描
# -w 1: 超時 1 秒
if nc -z -w 1 "$HOST" "$PORT"; then
echo "Port $PORT on $HOST is open"
else
echo "Port $PORT on $HOST is closed or filtered"
fi
常見問題與解決方案
1. DNS 解析失敗或過慢
在腳本中執行網路操作時,最常見的問題是 DNS 解析卡住。這通常發生在網路不穩或 DNS 伺服器回應慢時。
解決方案:為 curl、wget 或 ping 設定合理的超時時間(如 --max-time 或 -W 參數),避免腳本無限等待。同時,確保系統 /etc/resolv.conf 中的 DNS 伺服器是可靠且可達的。
2. SSL/TLS 憑證驗證錯誤
在企業環境或內部網路中,有時會遇到自簽憑證導致 curl: (60) SSL certificate problem 的錯誤。
解決方案:若為測試環境且確定安全,可暫時使用 curl -k 或 wget --no-check-certificate 跳過驗證。但請注意,生產環境應避免此做法,並應正確安裝 CA 憑證。
小結
透過這篇文章,我們學習了如何使用 curl、wget、ping 和 nc 在 Shell 腳本中進行各種網路操作。這些工具不僅能幫助我們檢查服務狀態,還能自動化下載與監控任務。記住,在撰寫網路相關的腳本時,錯誤處理與超時設定是確保腳本健壯性的關鍵。希望這些技巧能幫助你更高效地管理 Linux 系統。