一个WIFI热点的脚本思路,顺记shell知识 | 迟思堂工作室
A-A+

一个WIFI热点的脚本思路,顺记shell知识

2016-07-24 21:32 无线WIFI, 网络方面 暂无评论 阅读 1,666 次

本文主要学习ap-hotspot和create_ap脚本,总结了一下WIFI热点创建脚本的思路,另外记录一些shell学习知识点。

一、Linux环境创建WIFI热点脚本思路

1、参数处理

一个好的脚本,必须要考虑各类参数,就WIFI热点而言,频率、信道、SSID、密码、无线网卡名称、IP地址,等,都是必须要考虑的参数。下面参考create_ap脚本给出示例:

        -c)
            shift
            CHANNEL="$1"
            shift
            ;;
        -g)
            shift
            GATEWAY="$1"
            shift
            ;;
        -i)
            shift
            INTERFACE_WLAN="$1"
            shift
            ;;

2、检查无线网卡是否可正常工作

除了要判断无线网卡设备是否存在,还要判断其是否支持AP模式。另外还要判断是否作为STA连接其它AP。函数示例如下:

is_wifi_interface() {
    which iw > /dev/null 2>&1 && iw dev $1 info > /dev/null 2>&1 && return 0
    if which iwconfig > /dev/null 2>&1 && iwconfig $1 > /dev/null 2>&1; then
        USE_IWCONFIG=1
        return 0
    fi
    return 1
}

check_supported() {
# Check if the wireless card supports Access Point mode. This script won't work if it doesn't support it
if [[ ! $(iw list 2>&1 | grep -A6 "Supported interface modes" | grep AP$) ]]; then
	show_err "Your wireless card or driver does not support Access Point mode"
	exit 1
fi
}

check_network() {
# Check if Wireless is disabled
if [[ $(iwconfig "$INTERFACE_WLAN" 2>&1 | grep "Tx-Power=off") ]]; then
	show_err "WiFi is disabled, please enable WiFi before running this script"
	exit 1
# Check if Wireless is enabled, but connected to a network
elif [[ ! $(iwconfig "$INTERFACE_WLAN" 2>&1 | grep "ESSID:off/any") \
        && $(iwconfig "$INTERFACE_WLAN" 2>&1 | grep "ESSID:") ]]; then
	show_err "Please disconnect WiFi before proceeding"
	exit 1
fi
}

3、组装配置文件hostapd.conf

hostapd.conf是hostapd进程所需要的配置文件,里面包括了无线网卡名称、SSID、密码、信道等参数。示例如下:

cat <<EOF | tee $CONFDIR/hostapd.conf  > /dev/null 2>&1
beacon_int=100
interface=$INTERFACE_WLAN
driver=${DRIVER}
ssid=$SSID_NEW
channel=${CHANNEL}
max_num_sta=${MAX_STA}
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=$HIDDEN
wpa=2
wpa_passphrase=$WPAPASS
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
EOF

由于前面已经有文章对参数做了简单的介绍,这里就不展开讨论了。

4、组装配置文件dnsmasq.conf

dhcp功能使用dnsmasq程序实现,它依赖于dnsmasq.conf配置,文件根据参数(无线网卡名称、dhcp范围,等)来组装,示例:

cat <<EOF | tee $CONFDIR/dnsmasq.conf  > /dev/null 2>&1
# Bind to only one interface
bind-interfaces
# Choose interface for binding
interface=$INTERFACE_WLAN
# Specify range of IP addresses for DHCP leases
dhcp-range=$DHCP_RANGE,12h
#INTERFACE_NET=$INTERFACE_NET
EOF

实际生成的dnsmasq.conf文件示例如下:

# Bind to only one interface
bind-interfaces
# Choose interface for binding
interface=wlan0
# Specify range of IP addresses for DHCP leases
dhcp-range=192.168.250.1,192.168.250.200,255.255.255.0,12h

5、设置无线网卡IP

在调试中发现有时候运行dnsmasq不成功,老是提示wlan0不存在。后来在运行dnsmasq之前设置IP,就没有再发生过了。设置无线网卡IP命令十分简单,示例如下:

ifconfig "$INTERFACE_WLAN" $GATEWAY 2>&1

6、开启DHCP

执行如下命令:
dnsmasq -C $CONFDIR/dnsmasq.conf  -x $CONFDIR/dnsmasq.pid -l $CONFDIR/dnsmasq.leases 2>&1
-C后面指定参数文件,如果不指定,将默认使用/etc/dnsmasq.conf文件。

7、运行hostapd进程

执行如下命令:

hostapd -B $HOSTAPD_DEBUG_ARGS $CONFDIR/hostapd.conf -f "$logfile"

-B表示以守护进程方式在后台运行。如果不指定配置文件,将使用默认的/etc/hostapd/hostapd.conf文件。

8、其它说明

将无线网卡MAC地址最后三个字节添加到SSID中,代码如下:

        WLAN_MAC=$(get_macaddr "$INTERFACE_WLAN")
        LAST3BYTES=`echo "${WLAN_MAC}" | awk -F ':' '{print toupper($4) toupper($5) toupper($6)}'`
        SSID_NEW=${SSID_NEW}_$LAST3BYTES

首先调用get_macaddr获取到MAC地址,然后使用awk提取到最后三个字节,并转换成大写字母形式。比如当前所用的无线网卡MAC为:4C:41:54:45:4C:45,SSID默认为TESTWIFI,则最后的SSID变成TESTWIFI_454C45。做此步骤,是为了防止多个WIFI热点使用同一SSID的情况出现。

其它细节如使能转发,设置NAT,等,就不一一列出了。

二、SHELL知识

变量包含变量的用法:

CONFDIR=/tmp/ap-hotspot.${INTERFACE_WLAN}.conf
logfile="${CONFDIR}/hostapd.log"
pidfile="${CONFDIR}/hotspot.pid"

将参数配置组合,并输出到文件:

cat <<EOF | tee $CONFDIR/hostapd.conf  > /dev/null 2>&1
beacon_int=100
interface=$INTERFACE_WLAN
driver=${DRIVER}
ssid=$SSID_NEW
channel=${CHANNEL}
max_num_sta=${MAX_STA}
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=$HIDDEN
wpa=2
wpa_passphrase=$WPAPASS
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
EOF

接上,追加到同一文件,多行语句使用,注意追加为“>>”):

if [[ -n "$COUNTRY" ]]; then
    cat << EOF >> $hotspotconfig
    country_code=${COUNTRY}
    ieee80211d=1
    ieee80211h=1
    EOF
fi

再接上,也是追加到同一文件,但只追加一行语句,直接使用用“>>”:

if [[ $FREQ_BAND == 2.4 ]]; then
    echo "hw_mode=g" >> $CONFDIR/hostapd.conf 
else
    echo "hw_mode=a" >> $CONFDIR/hostapd.conf 
fi

本文参考如下程序,荣耀归于原作者。
ap-hotspot:
create_ap:

李迟 2016.7.24 周日



如果本文对阁下有帮助,不妨赞助笔者以输出更多好文章,谢谢!
donate




给我留言