Shell 腳本編程:七個(gè)提高效率的自動(dòng)化腳本
Shell腳本是Linux系統(tǒng)管理和自動(dòng)化任務(wù)的強(qiáng)大工具。通過編寫腳本,我們可以將重復(fù)性工作自動(dòng)化,大幅提升效率。
本文將介紹七個(gè)實(shí)用Shell腳本,涵蓋文件管理、系統(tǒng)監(jiān)控、數(shù)據(jù)處理等常見場景,適合初學(xué)者學(xué)習(xí)參考。
1. 自動(dòng)備份重要文件
場景:定期備份/home/user/documents目錄到/backup,并壓縮存檔。
#!/bin/bash
# 定義源目錄和目標(biāo)目錄
SOURCE_DIR="/home/user/documents"
BACKUP_DIR="/backup"
DATE=$(date +%Y-%m-%d)
# 創(chuàng)建備份文件(帶日期)
tar -czf "$BACKUP_DIR/backup_$DATE.tar.gz" "$SOURCE_DIR"
# 輸出成功信息
echo "Backup completed: $BACKUP_DIR/backup_$DATE.tar.gz"
說明:
- tar -czf:壓縮目錄為.tar.gz文件。
- date +%Y-%m-%d:獲取當(dāng)前日期,用于文件名。
2. 監(jiān)控磁盤空間并發(fā)送警報(bào)
場景:當(dāng)磁盤使用率超過90%時(shí)發(fā)送郵件報(bào)警。
#!/bin/bash
THRESHOLD=90
CURRENT=$(df / | grep / | awk '{print $5}' | sed 's/%//g')
if [ "$CURRENT" -gt "$THRESHOLD" ]; then
echo "Disk usage is $CURRENT% on $(hostname)" | mail -s "Disk Alert" admin@example.com
fi
說明:
- df /:獲取根分區(qū)磁盤使用率。
- mail:發(fā)送郵件(需配置郵件服務(wù))。
3. 自動(dòng)清理舊日志文件
場景:刪除/var/log下超過30天的日志文件。
#!/bin/bash
find /var/log -type f -name "*.log" -mtime +30 -exec rm {} \;
說明:
- find -mtime +30:匹配修改時(shí)間超過30天的文件。
- -exec rm {} \;:對找到的文件執(zhí)行刪除操作。
4. 檢查服務(wù)器存活狀態(tài)
場景:檢測一組服務(wù)器是否在線。
#!/bin/bash
SERVERS=("192.168.1.1" "192.168.1.2" "example.com")
for server in "${SERVERS[@]}"; do
ping -c 1 "$server" &> /dev/null && echo "$server is UP" || echo "$server is DOWN"
done
說明:
- ping -c 1:發(fā)送1次ICMP請求。
- &> /dev/null:忽略輸出,僅顯示結(jié)果。
5. 密碼生成器
場景:生成隨機(jī)密碼(含大小寫字母、數(shù)字、符號)。
#!/bin/bash
LENGTH=12
PASSWORD=$(tr -dc 'A-Za-z0-9!@#$%^&*' < /dev/urandom | head -c "$LENGTH")
echo "Generated Password: $PASSWORD"
說明:
- /dev/urandom:Linux隨機(jī)數(shù)設(shè)備。
- tr -dc:過濾指定字符集。
6. 實(shí)時(shí)監(jiān)控DNS解析狀態(tài)
場景:持續(xù)檢查域名是否能正常解析,失敗時(shí)記錄日志。
#!/bin/bash
domain="example.com"
log_file="dns.log"
while true; do
result=$(dig +short $domain)
[ -z "$result" ] && echo "$(date): DNS failed" >> $log_file
sleep 1
done
說明:
- dig +short:快速獲取DNS解析結(jié)果。
- 空結(jié)果時(shí)記錄日志,適合監(jiān)控關(guān)鍵域名可用性。
7. HTTP服務(wù)監(jiān)控腳本
場景:持續(xù)檢測網(wǎng)站可用性,記錄訪問狀態(tài)碼
#!/bin/bash
url="http://example.com"
log_file="http_test.log"
while true; do
http_result=$(curl -s -o /dev/null -w "%{http_code}" $url)
if [ $http_result -eq 200 ]; then
echo "$(date): HTTP request to $url succeeded (Status: $http_result)" >> $log_file
else
echo "$(date): HTTP request to $url failed (Status: $http_result)" >> $log_file
fi
sleep 1
done
說明:
- curl -w "%{http_code}":獲取HTTP狀態(tài)碼
- 狀態(tài)碼200時(shí)記錄成功,其他狀態(tài)記錄失敗