🌐 Network & Automation Scripts
Các scripts trong phần này giúp bạn kiểm tra kết nối mạng, tự động hóa các tác vụ và quản lý cron job một cách hiệu quả.
📡 1. Script Kiểm Tra Kết Nối Mạng
Kiểm Tra Kết Nối Và Cảnh Báo
#!/bin/bash
# network_monitor.sh - Kiểm tra kết nối mạng và gửi cảnh báo
# Cấu hình
LOG_FILE="/var/log/network_monitor.log"
ALERT_EMAIL="[email protected]"
HOSTS_TO_CHECK=("google.com" "cloudflare.com" "github.com" "192.168.1.1")
PORT_TO_CHECK=("80" "443" "22")
CHECK_INTERVAL=300 # Kiểm tra mỗi 5 phút
MAX_PACKET_LOSS=20 # Cảnh báo khi mất gói > 20%
MAX_LATENCY=100 # Cảnh báo khi độ trễ > 100ms
# Hàm ghi log
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Hàm gửi cảnh báo email
send_alert() {
local subject="$1"
local message="$2"
echo "$message" | mail -s "[ALERT] $subject" "$ALERT_EMAIL"
log_message "ALERT SENT: $subject"
}
# Hàm kiểm tra kết nối ping
check_ping() {
local host=$1
local ping_result
local packet_loss
local avg_latency
log_message "Kiểm tra kết nối tới $host"
# Thực hiện ping test
ping_result=$(ping -c 5 "$host" 2>&1)
# Kiểm tra host có tồn tại không
if [[ $ping_result == *"unknown host"* ]]; then
send_alert "Host không tồn tại" "Không thể phân giải tên miền: $host\nServer: $(hostname)\nTime: $(date)"
return 1
fi
# Tính toán tỷ lệ mất gói
packet_loss=$(echo "$ping_result" | grep -oP '\d+(?=% packet loss)')
# Tính toán độ trễ trung bình
avg_latency=$(echo "$ping_result" | grep -oP 'rtt min/avg/max/mdev = \d+\.\d+/\K\d+\.\d+(?=/\d+\.\d+/\d+\.\d+)')
avg_latency=${avg_latency%.*} # Loại bỏ phần thập phân
log_message "Kết quả ping $host: Mất gói ${packet_loss}%, Độ trễ ${avg_latency}ms"
# Kiểm tra và gửi cảnh báo nếu cần
if [ "$packet_loss" -gt "$MAX_PACKET_LOSS" ]; then
local message="Tỷ lệ mất gói cao khi kết nối tới $host: ${packet_loss}%\nNgưỡng cảnh báo: ${MAX_PACKET_LOSS}%\nServer: $(hostname)\nTime: $(date)"
send_alert "Mất gói cao - $host" "$message"
fi
if [ "$avg_latency" -gt "$MAX_LATENCY" ]; then
local message="Độ trễ cao khi kết nối tới $host: ${avg_latency}ms\nNgưỡng cảnh báo: ${MAX_LATENCY}ms\nServer: $(hostname)\nTime: $(date)"
send_alert "Độ trễ cao - $host" "$message"
fi
return 0
}
# Hàm kiểm tra port
check_port() {
local host=$1
local port=$2
log_message "Kiểm tra port $port trên $host"
# Sử dụng nc để kiểm tra port
if nc -z -w 5 "$host" "$port" &>/dev/null; then
log_message "Port $port trên $host: OPEN"
return 0
else
log_message "Port $port trên $host: CLOSED"
local message="Port $port trên $host không thể kết nối\nServer: $(hostname)\nTime: $(date)"
send_alert "Port không phản hồi - $host:$port" "$message"
return 1
fi
}
# Hàm kiểm tra tốc độ mạng
check_network_speed() {
log_message "Kiểm tra tốc độ mạng"
# Sử dụng speedtest-cli nếu đã cài đặt
if command -v speedtest-cli &>/dev/null; then
local speed_result=$(speedtest-cli --simple)
local download_speed=$(echo "$speed_result" | grep "Download" | awk '{print $2}')
local upload_speed=$(echo "$speed_result" | grep "Upload" | awk '{print $2}')
log_message "Tốc độ mạng: Download ${download_speed} Mbit/s, Upload ${upload_speed} Mbit/s"
# Có thể thêm logic cảnh báo nếu tốc độ quá thấp
else
log_message "speedtest-cli không được cài đặt. Bỏ qua kiểm tra tốc độ mạng."
fi
}
# Hàm kiểm tra DNS
check_dns() {
local domain=$1
log_message "Kiểm tra DNS cho $domain"
# Sử dụng dig để kiểm tra DNS
if ! dig +short "$domain" &>/dev/null; then
local message="Không thể phân giải DNS cho $domain\nServer: $(hostname)\nTime: $(date)"
send_alert "Lỗi DNS - $domain" "$message"
return 1
fi
return 0
}
# Hàm chính
main() {
log_message "Bắt đầu kiểm tra kết nối mạng"
# Kiểm tra ping tới các host
for host in "${HOSTS_TO_CHECK[@]}"; do
check_ping "$host"
done
# Kiểm tra các port
for host in "${HOSTS_TO_CHECK[@]}"; do
for port in "${PORT_TO_CHECK[@]}"; do
check_port "$host" "$port"
done
done
# Kiểm tra DNS
for host in "${HOSTS_TO_CHECK[@]}"; do
# Chỉ kiểm tra DNS cho tên miền, không phải IP
if [[ ! "$host" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
check_dns "$host"
fi
done
# Kiểm tra tốc độ mạng (tùy chọn)
# check_network_speed
log_message "Hoàn thành kiểm tra kết nối mạng"
}
# Chạy hàm chính
main
Sử Dụng Script
- Cấp quyền thực thi:
chmod +x network_monitor.sh
- Chạy script:
./network_monitor.sh
- Thêm vào crontab để chạy định kỳ:
*/5 * * * * /path/to/network_monitor.sh
Tùy Chỉnh
- Thay đổi danh sách
HOSTS_TO_CHECK
vàPORT_TO_CHECK
theo nhu cầu - Điều chỉnh ngưỡng cảnh báo
MAX_PACKET_LOSS
vàMAX_LATENCY
- Thêm các kiểm tra khác như traceroute, MTU, v.v.