システム管理者、特に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