一个WIFI热点的脚本思路,顺记shell知识
本文主要学习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命令十分简单,示例如下:
6、开启DHCP
执行如下命令:
dnsmasq -C $CONFDIR/dnsmasq.conf -x $CONFDIR/dnsmasq.pid -l $CONFDIR/dnsmasq.leases 2>&1
-C后面指定参数文件,如果不指定,将默认使用/etc/dnsmasq.conf文件。
7、运行hostapd进程
执行如下命令:
-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 周日