実務で役立つシェルスクリプト自動化ツール集

1. 不審なアクセス元IPの自動ブロック

Nginxのアクセスログを監視し、短時間で頻繁にリクエストを送るIPを特定してiptablesで遮断します。

#!/bin/bash
TARGET_LOG="/var/log/nginx/access.log"
THRESHOLD=20
CURRENT_TIME=$(date +%d/%b/%Y:%H:%M)

# 直近でアクセス数が多いIPを抽出
ABUSIVE_IPS=$(tail -n 1000 "$TARGET_LOG" | grep "$CURRENT_TIME" | awk '{a[$1]++} END {for(i in a) if(a[i] > '$THRESHOLD') print i}')

for IP in $ABUSIVE_IPS; do
    if ! iptables -C INPUT -s "$IP" -j DROP 2>/dev/null; then
        iptables -I INPUT -s "$IP" -j DROP
        echo "$(date '+%Y-%m-%d %H:%M:%S') Blocked: $IP" >> /var/log/ip_block.log
    fi
done

2. ログファイルのローテーション処理

古いログファイルを月ごとのディレクトリに退避させ、Nginxにシグナルを送って新規ログファイルを作成させます。

#!/bin/bash
BASE_DIR="/var/log/nginx"
ARCHIVE_DIR="$BASE_DIR/$(date +%Y-%m)"
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)

mkdir -p "$ARCHIVE_DIR"
mv "$BASE_DIR/access.log" "$ARCHIVE_DIR/access-$YESTERDAY.log"

# Nginx設定の再読み込み
kill -USR1 $(cat /var/run/nginx.pid)

3. リアルタイム・ネットワーク帯域監視

指定したネットワークインターフェースのトラフィックを1秒ごとに計測します。

#!/bin/bash
INTERFACE=$1
echo "Monitoring $INTERFACE (Ctrl+C to stop)"

while true; do
    read RX1 TX1 < <(grep "$INTERFACE" /proc/net/dev | awk '{print $2, $10}')
    sleep 1
    read RX2 TX2 < <(grep "$INTERFACE" /proc/net/dev | awk '{print $2, $10}')
    
    IN_KB=$(( (RX2 - RX1) / 1024 ))
    OUT_KB=$(( (TX2 - TX1) / 1024 ))
    
    echo "IN: ${IN_KB}KB/s | OUT: ${OUT_KB}KB/s"
done

4. OS環境の初期設定自動化

サーバー構築時のセキュリティ対策とパフォーマンスチューニングを自動化します。

#!/bin/bash
# タイムゾーン設定
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# SELinux無効化
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# オープンファイル制限の引き上げ
cat >> /etc/security/limits.conf << EOF
* soft nofile 65535
* hard nofile 65535
EOF

# カーネルパラメータ最適化
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_syn_backlog = 8192
EOF
sysctl -p

5. サーバーリソースの一括診断スクリプト

CPU、メモリ、ディスク使用率、現在のTCP接続数を一括で出力します。

#!/bin/bash
check_resources() {
    echo "--- CPU Usage ---"
    top -bn1 | grep "Cpu(s)" | awk '{print "Usage: " $2 + $4 "%"}'
    
    echo "--- Memory ---"
    free -h | awk '/^Mem:/ {print "Used: " $3 "/" $2}'
    
    echo "--- Disk ---"
    df -h | grep '^/dev/' | awk '{print $6 ": " $5 " used"}'
    
    echo "--- TCP Connections ---"
    ss -ant | awk '{status[$1]++} END {for(i in status) print i ": " status[i]}'
}

check_resources

タグ: Shell linux automation sysadmin bash

5月20日 06:24 投稿