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
다음 두 가지를 변경해야 합니다.
이
-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