我想用 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
脚本中的最后一个命令一样。