Linuxシステム管理における実用的なシェルスクリプト集

システム管理者、特にLinux環境での運用担当者は、効率的な作業のためにスクリプトの作成能力が不可欠です。スクリプトを活用することで、繰り返しの作業を自動化し、人的ミスを削減できます。ここでは、Linux運用で頻繁に利用されるシェルスクリプトの例をいくつか紹介します。

1. 文字デバイスファイルの確認とコピー

指定されたファイルが文字デバイスファイルかどうかを判定し、該当する場合にのみ/devディレクトリへコピーするスクリプトです。

#!/bin/bash
read -p "ファイル名を入力してください: " target_file

if [[ -c "$target_file" ]]; then
    sudo cp "$target_file" /dev/
    echo "ファイルを/devにコピーしました"
else
    echo "指定されたファイルは文字デバイスではありません"
fi

2. ユーザーグループと複数ユーザーの一括作成

class1というグループを作成し、それに所属するstd01〜std30までの30人のユーザーを一括で作成します。

#!/bin/bash
sudo groupadd class1

for i in {1..30}; do
    if [[ $i -lt 10 ]]; then
        username="std0$i"
    else
        username="std$i"
    fi
    
    sudo useradd -m -g class1 "$username"
    echo "ユーザー $username を作成しました"
done

3. 複数ユーザーの一括削除

stud1〜stud50までの50人のユーザーを一括で削除します。

#!/bin/bash
for i in {1..50}; do
    sudo userdel -r "stud$i"
    echo "ユーザー stud$i を削除しました"
done

4. システム管理タスクの自動化

以下のタスクをcrontabを使って自動化します:

  • 毎日16:50に/abcディレクトリの内容を削除
  • 8:00〜18:00の間、毎時/xyz/x1ファイルの最初のフィールドを/backup/bak01.txtに追記
  • 毎週月曜日17:50に/dataディレクトリをアーカイブ
  • 毎日17:55にCD-ROMをアンマウント
# crontab設定
50 16 * * * rm -rf /abc/*
0 8-18/1 * * * cut -f1 /xyz/x1 >> /backup/bak01.txt
50 17 * * 1 tar czf /backup/data_$(date +\%Y\%m\%d).tar.gz /data
55 17 * * * umount /dev/cdrom

5. 月初の/etcディレクトリバックアップ

毎月1日に/etcディレクトリをバックアップし、圧縮して保存します。

#!/bin/bash
backup_dir="/root/bak"
timestamp=$(date "+%y%m%d")
archive_name="${timestamp}_etc.tar.gz"

mkdir -p "$backup_dir"
cd /
tar czf "${backup_dir}/${archive_name}" etc/
echo "バックアップ完了: ${archive_name}"

6. 週次のユーザーデータバックアップ

毎週日曜日0時に/user/backupディレクトリを/tmpにバックアップします。

# crontabエントリ
0 0 * * 0 cp -r /user/backup /tmp/

7. 指定権限での複数ディレクトリ作成

/userdata配下にuser1〜user50の50個のディレクトリを作成し、適切な権限を設定します。

#!/bin/bash
base_dir="/userdata"

if [[ ! -d "$base_dir" ]]; then
    sudo mkdir "$base_dir"
fi

for i in {1..50}; do
    dir_path="${base_dir}/user${i}"
    sudo mkdir -p "$dir_path"
    sudo chmod 754 "$dir_path"
    echo "ディレクトリ $dir_path を作成・権限設定しました"
done

8. MySQLデータベースの自動バックアップ

MySQLデータベースをバックアップし、30日以上前のバックアップファイルを削除します。

#!/bin/bash
backup_root="/data/backup/mysql"
today_dir="${backup_root}/$(date +%Y-%m-%d)"
db_name="www"
db_user="backup"
db_pass="password"

mkdir -p "$today_dir"
mysqldump -u"$db_user" -p"$db_pass" "$db_name" > "${today_dir}/${db_name}.sql"
tar czf "${today_dir}/${db_name}.tar.gz" -C "$today_dir" "${db_name}.sql"

# 30日以上前のバックアップを削除
find "$backup_root" -type d -mtime +30 -exec rm -rf {} \;

9. Nginxインストールスクリプト

Nginxのダウンロード、インストール、起動、停止をメニュー形式で実行できます。

#!/bin/bash
nginx_version="nginx-1.20.0"
install_prefix="/usr/local/nginx"

case "$1" in
    download)
        wget "http://nginx.org/download/${nginx_version}.tar.gz"
        ;;
    install)
        yum install -y pcre-devel openssl-devel
        tar xzf "${nginx_version}.tar.gz"
        cd "$nginx_version"
        ./configure --prefix="$install_prefix" \
                    --with-http_ssl_module \
                    --with-http_v2_module
        make && sudo make install
        ;;
    start)
        "$install_prefix/sbin/nginx"
        ;;
    stop)
        pkill nginx
        ;;
    *)
        echo "使用法: $0 {download|install|start|stop}"
        ;;
esac

10. アーカイブファイルの一括展開

TARおよびZIPファイルを指定ディレクトリに一括展開します。

#!/bin/bash
source_path="/tmp/archives"
dest_path="/usr/www/extracted"

# TARファイルの展開
find "$source_path" -name "*.tar" -exec tar xf {} -C "$dest_path" \;

# ZIPファイルの展開(サブディレクトリ作成)
find "$source_path" -name "*.zip" | while read zipfile; do
    dirname=$(basename "$zipfile" .zip)
    mkdir -p "${dest_path}/${dirname}"
    unzip -o "$zipfile" -d "${dest_path}/${dirname}"
done

11. SSHによるファイル一括転送

リストファイルに記載されたファイルやディレクトリをSSH経由でリモートホストに転送します。

#!/bin/bash
list_file="$1"
remote_host="$2"

if [[ ! -f "$list_file" ]]; then
    echo "リストファイルが見つかりません"
    exit 1
fi

while IFS= read -r item; do
    if [[ -z "$item" ]] || [[ "$item" =~ ^#.* ]]; then
        continue
    fi
    
    if [[ -f "$item" ]]; then
        scp "$item" "$remote_host:$item"
    elif [[ -d "$item" ]]; then
        scp -r "$item" "$remote_host:$item"
    fi
done < "$list_file"

12. ファイル名の大文字小文字変換

カレントディレクトリ内のすべてのファイル名を小文字に変換します。

#!/bin/bash
for file in *; do
    if [[ -f "$file" ]]; then
        lowercase=$(echo "$file" | tr '[:upper:]' '[:lower:]')
        if [[ "$file" != "$lowercase" ]]; then
            mv "$file" "$lowercase"
            echo "変換: $file -> $lowercase"
        fi
    fi
done

13. Webサイト監視スクリプト

指定したURLのコンテンツが特定のパターンにマッチするまで監視し、マッチした時点でメール通知します。

#!/bin/bash
url="$1"
pattern="$2"
email="$3"
interval=300

while true; do
    if curl -s "$url" | grep -qE "$pattern"; then
        echo "サイトが条件を満たしました: $url" | mail -s "監視通知" "$email"
        break
    fi
    sleep "$interval"
done

14. GIFからPNGへの一括変換

指定されたGIFファイルをPNG形式に変換します。

#!/bin/bash
for gif_file in "$@"; do
    if [[ "${gif_file##*.}" == "gif" ]]; then
        png_file="${gif_file%.gif}.png"
        convert "$gif_file" "$png_file"
        echo "変換完了: $gif_file -> $png_file"
    fi
done

15. 数値範囲の出力

指定された開始値から終了値までの整数を順に出力します。

#!/bin/bash
start=${1:-1}
end=$2

for ((i=start; i<=end; i++)); do
    echo "$i"
done

16. 単語頻度解析

テキストファイル内の単語出現頻度をカウントして表示します。

cat "$@" | \
tr '[:space:]' '\n' | \
tr '[:upper:]' '[:lower:]' | \
sed "s/[^a-zA-Z']//g" | \
grep -v "^$" | \
sort | \
uniq -c | \
sort -nr

タグ: bash shell-script linux-administration automation cron

7月10日 20:01 投稿