optargsを使ってスニッフィングスクリプトを作成したいと思います。
これはスクリプトです。
#!/bin/bash
if [[ $EUID -gt 0 ]];then
echo "$(basename "$0") requires root privileges"
exit 1
fi
function help(){
echo ""
echo "Usage: $(basename "$0") -i interface -b mac_address"
echo ""
echo " -i Wireless interface name (monitor mode)"
echo " -b BBSID wireless mac"
}
function sniff(){
airodump-ng "$1" -w PSK -c 36 --bssid "$2"
if [ $? -gt 0 ];then
echo "[!] Error. Check that SSID name is Radius and channel is 7"
exit 2
fi
}
while getopts "h:i:b:" option;do
case "$option" in
h)
help
;;
i)
i=$OPTARG
;;
b)
b=$OPTARG
;;
esac
done
sniff "$i" "$b"
私はこれをしたい:
たとえば、
script.sh -i wlan0 -b FF:FF:FF:FF:FF:FF
ただし、-hオプションでは実行できません。
ベストアンサー1
次の2つを変更する必要があります。
この
-h
オプションは引数を受け入れないため、最初の引数は次のものでなければなりませんgetopts
(hi:b:
またはb:hi:
アルファベット順が必要な場合)。つまり、引数を取るオプションは末尾の引数と一緒にリストする必要があり、引数を取らないオプション:
は後続の引数なしでリストする必要があります:
。exit
関数を呼び出したhelp
後にこれを行う必要があるかもしれません。それ以外の場合、コードはsniff
後で呼び出しを続けます。
私は個人的にその-h
オプションにも注目したいと思います。コマンドライン解析エラーがある場合は関数を呼び出しますが、help
すべての場合にステートメントの最後で終了します。exit 1
*)
case ... esac
#!/bin/sh
cmd=$(basename "$0")
if [ "$(id -u)" -ne 0 ]; then
printf '%s requires root privileges\n' "$cmd" >&2
exit 1
fi
help () {
cat <<END_HELP
Usage:
$cmd -i interface -b mac_address
$cmd -h
-i Wireless interface name (monitor mode)
-b BBSID wireless mac
-h Display this help text and terminate
END_HELP
}
sniff () {
airodump-ng "$1" -w PSK -c 36 --bssid "$2"
err=$?
if [ "$err" -ne 0 ]; then
echo '[!] Error. Check that SSID name is Radius and channel is 7' >&2
fi
return "$err"
}
while getopts hi:b: opt; do
case "$opt" in
h) help; exit ;;
i) i=$OPTARG ;;
b) b=$OPTARG ;;
*) help; exit 1 ;;
esac
done
sniff "$i" "$b"
スクリプトに要件がないため、スクリプトbash
に置き換えました。テストをバイパスするためにスクリプト環境で他の方法を設定するのは簡単であるため、/bin/sh
テストをEUID
より安全に実行できます。id -u
EUID=0
終了するのではなく、ユーティリティの終了ステータスをsniff
返すようにしました。これにより、スクリプトの最後のコマンドairodump-ng
と同様に、スクリプトの主要部分が終了状態で終了します。sniff