2つの関数bashスクリプトで3つのoptargsを使用する

2つの関数bashスクリプトで3つのoptargsを使用する

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つを変更する必要があります。

  1. この-hオプションは引数を受け入れないため、最初の引数は次のものでなければなりませんgetoptshi:b:またはb:hi:アルファベット順が必要な場合)。つまり、引数を取るオプションは末尾の引数と一緒にリストする必要があり、引数を取らないオプション:は後続の引数なしでリストする必要があります:

  2. 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 -uEUID=0

終了するのではなく、ユーティリティの終了ステータスをsniff返すようにしました。これにより、スクリプトの最後のコマンドairodump-ngと同様に、スクリプトの主要部分が終了状態で終了します。sniff

おすすめ記事