概要
先だってChatGPTが書いた
- IPアドレスを尋ねる
- IPアドレスそのままか、/24ごとブロックするか、/16ごとブロックするかを0~2で質問(空白エンターは0)
- 実行前に内容を確認する。yなら続行、nなら中止
- 1~2に沿ってufw deny処理を行う
- 「ルールを付け加えました。他のIPブロックしますか?」の分岐を出す。yなら1に戻る。nなら次の処理
- ufw reloadを行う
- 現在のブロック状況を出しますか? yならufw status numberedを表示。nなら終了メッセージを出す
このスクリプト、Bingが書くとどうなるかを試してみました。
Bingの出力結果
- bing_ufw_deny.sh
#!/bin/bash
# ループフラグを設定
loop=true
# ループ開始
while $loop; do
# IPアドレスを尋ねる
echo "ブロックしたいIPアドレスを入力してください。"
read ip
# IPアドレスの形式をチェック
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
# IPアドレスそのままか、/24ごとブロックするか、/16ごとブロックするかを0~2で質問
# 空エンターは0
echo "IPアドレスをそのままブロックする場合は0、/24ごとブロックする場合は1、/16ごとブロックする場合は2を入力してください。"
echo "何も入力しない場合は0とみなします。"
read option
# オプションに応じてIPアドレスを変換
case $option in
1)
# /24ごとブロックする場合
ip=${ip%.*}.0/24
;;
2)
# /16ごとブロックする場合
ip=${ip%.*.*}.0.0/16
;;
*)
# その他の場合はIPアドレスそのまま
;;
esac
# 実行前に内容を確認する。yなら続行、nなら中止
echo "ufw deny from $ip to any を実行します。よろしいですか? (y/n)"
read confirm
if [[ $confirm == [yY] ]]; then
# yならufw deny処理を行う
sudo ufw deny from $ip to any
echo "ルールを付け加えました。"
else
# nなら中止メッセージを出す
echo "処理を中止しました。"
fi
# 「ルールを付け加えました。他のIPブロックしますか?」の分岐を出す。yなら1に戻る。nなら次の処理
echo "他のIPをブロックしますか? (y/n)"
read loop
if [[ $loop == [yY] ]]; then
# yならループフラグをtrueにして1に戻る
loop=true
else
# nならループフラグをfalseにしてループを抜ける
loop=false
fi
else
# IPアドレスの形式が不正な場合はエラーメッセージを出す
echo "正しいIPアドレスを入力してください。"
fi
done
# ufw reloadを行う
echo "ufw reload を実行します。"
sudo ufw reload
# 現在のブロック状況を出しますか? yならufw status numberedを表示。nなら終了メッセージを出す
echo "現在のブロック状況を表示しますか? (y/n)"
read status
if [[ $status == [yY] ]]; then
# yならufw status numberedを表示する
sudo ufw status numbered
else
# nなら終了メッセージを出す
echo "スクリプトが終了しました。"
fi
体感として
Bingはネットワークアドレスの切り出しが素直です。
- Bingの場合
# オプションに応じてIPアドレスを変換
case $option in
1)
# /24ごとブロックする場合
ip=${ip%.*}.0/24
;;
2)
# /16ごとブロックする場合
ip=${ip%.*.*}.0.0/16
;;
*)
# その他の場合はIPアドレスそのまま
;;
esac
- ChatGPTの場合
# ネットワークアドレスに変換
if [[ -n "$block_cidr" ]]; then
if [[ $block_option == "1" ]]; then
# /24で区切る場合
network_address=$(echo $ip_address | cut -d'.' -f1-3)
# CIDR表記の生成 (/24)
cidr_notation="$network_address.0$block_cidr"
elif [[ $block_option == "2" ]]; then
# /16で区切る場合
network_address=$(echo $ip_address | cut -d'.' -f1-2)
# CIDR表記の生成 (/16)
cidr_notation="$network_address.0.0$block_cidr"
fi
else
cidr_notation="$ip_address"
fi
と、シンプルになっています。
蛇足ですが、ChatGPTはこの処理にたどり着くまで5回ぐらいの錯誤を繰り返しました。
なので、このケースで言えばBingはよりユーザーの意図をくみ取ったと考えられます。
こちらの選択肢もあると分かったという収穫。