在两个函数bash脚本中使用3个optarg

在两个函数bash脚本中使用3个optarg

我想用 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选项不接受任何参数,因此您的第一个参数应该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 -u因为很容易EUID=0在脚本环境中设置其他方式来绕过测试。

我没有退出,而是sniff让它返回airodump-ng实用程序的退出状态。然后,脚本的主要部分将退出,并将其作为退出状态,就像sniff脚本中的最后一个命令一样。

相关内容