두 개의 함수 bash 스크립트에서 3개의 optargs 사용

두 개의 함수 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

다음 두 가지를 변경해야 합니다.

  1. -h옵션은 어떤 인수도 허용하지 않으므로 첫 번째 인수는 다음이어야 합니다 getopts( hi: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

관련 정보