iw 命令 -- linux 无线管理
iw 命令入门
- 1. 概述
- 1.1 基本概念
- 2. iw --help 命令分析
- 3. 核心命令
- 3.1 查看
- 3.2 扫描
- 3.3 连接
- 3.4 接口管理
- 4. 实用脚本
- 4.1 脚本1:WiFi 连接检查器
- 4.2 脚本2:WiFi 热点创建器
- 4.3 脚本语法详解
- Shebang 解释器声明
- 变量定义和使用
- 条件判断语法
- 权限检查详解
- Here Document 语法
- 命令执行和检查
- 定时任务 crontab
- 4.4 脚本使用方法详解
- 创建和运行脚本
- 权限说明
- 脚本作用说明
- 5. 串口环境使用
- 5.1 直接命令输入
- 5.2 脚本执行方式
- 6. 常用命令速查
- 6.1 快速连接
- 6.2 状态检查
- 6.3 信号监控
- 6.4 热点检查
- 7. 故障排查
- 7.1 常见问题诊断
- 7.2 重置网络接口
1. 概述
iw
是 Linux 系统中用于配置和管理无线网络设备的命令行工具。它基于 nl80211 内核接口,是现代无线网络管理的标准工具。
1.1 基本概念
- PHY(物理设备):无线芯片硬件,如 phy0
- DEV(逻辑接口):网络接口,如 wlan0、mon0
- SSID:无线网络名称
- BSSID:AP 的 MAC 地址
2. iw --help 命令分析
执行 iw --help | head -n 50
会显示以下内容:
Usage: iw [options] command
Options:
–debug enable netlink debugging
–version show version (5.9)
Commands:
dev ap stop
Stop AP functionality
dev ap start
[5|10|20|40|80|80+80|160] [<center1_freq> [<center2_freq>]] [hidden-ssid|zeroed-ssid] head [tail ] [inactivity-time ] [key0:abcde d:1:6162636465]
phy coalesce show
Show coalesce status.
phy coalesce disable
Disable coalesce.
phy coalesce enable
Enable coalesce with given configuration.
The configuration file contains coalesce rules:
delay=
condition=
patterns=<[offset1+],<[offset2+],…>
delay=
condition=
patterns=<[offset1+],<[offset2+],…>
…
delay: maximum coalescing delay in msec.
condition: 1/0 i.e. ‘not match’/‘match’ the patterns
patterns: each pattern is given as a bytestring with ‘-’ in
places where any byte may be present, e.g. 00:11:22:-:44 will
match 00:11:22:33:44 and 00:11:22:33:ff:44 etc. Offset and
pattern should be separated by ‘+’, e.g. 18+43:34:00:12 will
match ‘43:34:00:12’ after 18 bytes of offset in Rx packet.
dev auth type:open|shared [key 0:abcde d:1:6162636465]
Authenticate with the given network.
dev connect [-w] [] [] [key 0:abcde d:1:6162636465] [mfp:req/opt/no]
Join the network with the given SSID (and frequency, BSSID).
With -w, wait for the connect to finish or fail.
dev disconnect
Disconnect from the current network.
dev cqm rssi <threshold|off> []
符号含义说明:
- [] 方括号:可选参数
- < > 尖括号:必填参数
- | 竖线:多选一
- … 省略号:可重复参数
主要选项解释:
- –debug:启用调试模式,显示详细的内核通信信息。用于排查连接问题。示例:
iw --debug dev wlan0 scan
- –version:显示 iw 工具版本号。示例:
iw --version
常见命令格式解析:
dev <devname> connect [-w] <SSID> [<freq>] [<bssid>]
:其中 必须指定接口名如 wlan0,[-w] 是可选的等待参数,<SSID> 必须指定网络名称,[<freq>] 和 [<bssid>] 是可选参数
iw dev wlan0 connect MyHomeWiFi
iw dev wlan0 connect -w Office_NET 5180
iw dev wlan0 connect -w Cafe_Guest 2462 00:11:22:33:44:55
3. 核心命令
3.1 查看
查看所有无线接口:iw dev
查看物理设备信息:iw phy
查看接口详细信息:iw dev wlan0 info
查看硬件能力:iw list
3.2 扫描
基础扫描:iw dev wlan0 scan
扫描特定网络:iw dev wlan0 scan ssid "MyWiFi"
被动扫描(不发送探测包):iw dev wlan0 scan passive
3.3 连接
连接开放网络:iw dev wlan0 connect "OpenWiFi"
连接并等待结果:iw dev wlan0 connect -w "MyWiFi"
断开连接:iw dev wlan0 disconnect
查看连接状态:iw dev wlan0 link
3.4 接口管理
创建监控接口:iw phy phy0 interface add mon0 type monitor
删除接口:iw dev mon0 del
改变接口类型:iw dev wlan0 set type monitor
4. 实用脚本
4.1 脚本1:WiFi 连接检查器
文件:保存为 /usr/local/bin/wifi-check.sh
#!/bin/bash# WiFi 连接检查脚本
# 用途:检查 WiFi 连接状态,断线时自动重连INTERFACE="wlan0"
SSID="MyWiFi"
LOG_FILE="/var/log/wifi-check.log"# 记录日志函数
log_message() {echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}# 检查接口是否存在
if ! iw dev | grep -q "$INTERFACE"; thenlog_message "错误:接口 $INTERFACE 不存在"exit 1
fi# 检查当前连接状态
CONNECTION_STATUS=$(iw dev $INTERFACE link)if echo "$CONNECTION_STATUS" | grep -q "Connected"; then# 已连接,显示信息CURRENT_SSID=$(echo "$CONNECTION_STATUS" | grep "SSID" | cut -d' ' -f2-)SIGNAL=$(echo "$CONNECTION_STATUS" | grep "signal" | cut -d' ' -f2-)echo "已连接到:$CURRENT_SSID"echo "信号强度:$SIGNAL"log_message "连接正常 - SSID: $CURRENT_SSID, 信号: $SIGNAL"
else# 未连接,尝试重连echo "未连接,正在尝试连接到 $SSID..."log_message "开始重连到 $SSID"# 先扫描确认网络存在if iw dev $INTERFACE scan | grep -q "SSID: $SSID"; then# 网络存在,尝试连接iw dev $INTERFACE connect "$SSID"sleep 5# 检查连接结果if iw dev $INTERFACE link | grep -q "Connected"; thenecho "重连成功!"log_message "重连成功到 $SSID"elseecho "重连失败"log_message "重连失败到 $SSID"fielseecho "找不到网络 $SSID"log_message "扫描未找到网络 $SSID"fi
fi
4.2 脚本2:WiFi 热点创建器
文件:保存为 /usr/local/bin/create-hotspot.sh
#!/bin/bash# WiFi 热点创建脚本
# 用途:快速创建一个简单的 WiFi 热点用于测试HOTSPOT_NAME="TestHotspot"
CHANNEL="6"
INTERFACE="wlan0"echo "=== WiFi 热点创建器 ==="# 检查是否以 root 运行
if [ "$EUID" -ne 0 ]; thenecho "错误:此脚本需要 root 权限运行"echo "请使用:sudo $0"exit 1
fi# 检查接口是否存在
if ! iw dev | grep -q "$INTERFACE"; thenecho "错误:接口 $INTERFACE 不存在"echo "可用接口:"iw dev | grep Interface | cut -d' ' -f2exit 1
fi# 检查接口是否支持 AP 模式
if ! iw list | grep -A10 "Supported interface modes" | grep -q "AP"; thenecho "错误:硬件不支持 AP 模式"exit 1
fiecho "1. 断开现有连接..."
iw dev $INTERFACE disconnect 2>/dev/nullecho "2. 设置接口为 AP 模式..."
if ! iw dev $INTERFACE set type ap; thenecho "错误:无法设置 AP 模式"exit 1
fiecho "3. 启动网络接口..."
ip link set $INTERFACE upecho "4. 设置工作信道 $CHANNEL..."
if ! iw dev $INTERFACE set channel $CHANNEL; thenecho "错误:无法设置信道"exit 1
fiecho "5. 分配 IP 地址..."
ip addr add 192.168.10.1/24 dev $INTERFACEecho "=== 热点配置完成 ==="
echo "热点名称:$HOTSPOT_NAME"
echo "工作信道:$CHANNEL"
echo "接口地址:192.168.10.1"
echo ""
echo "注意:这只是基础配置"
echo "完整热点功能需要配置 hostapd 和 dnsmasq"
echo ""
echo "查看接口状态:"
iw dev $INTERFACE infoecho ""
echo "停止热点请运行:"
echo "sudo iw dev $INTERFACE set type managed"
echo "sudo dhclient $INTERFACE"
4.3 脚本语法详解
Shebang 解释器声明
#!/bin/bash
中的 #!
叫做 shebang,告诉系统用哪个解释器运行这个脚本:
#!
:shebang 标记/bin/bash
:bash 解释器的路径- 作用:当你执行
./script.sh
时,系统知道用 bash 来执行这个脚本
变量定义和使用
INTERFACE="wlan0" # 定义变量
echo "$INTERFACE" # 使用变量,$符号取值
echo "${INTERFACE}_backup" # 花括号避免歧义
条件判断语法
if [ condition ]; then # if 开始# 执行代码
else # 可选的 else# 执行代码
fi # fi 结束 if 语句# 常见条件:
if [ "$EUID" -ne 0 ]; then # -ne 表示 "不等于"
if ! command; then # ! 表示 "非",命令失败时执行
if echo "$text" | grep -q "word"; then # 检查文本包含某个词
权限检查详解
if [ "$EUID" -ne 0 ]; thenecho "需要 root 权限"exit 1
fi
$EUID
:当前用户的有效用户ID,root用户ID是0-ne
:不等于(not equal)exit 1
:退出脚本,返回错误码1
Here Document 语法
cat > /tmp/wifi-connect.sh << 'EOF'
#!/bin/bash
echo "Hello World"
EOF
cat >
:将内容写入文件<< 'EOF'
:Here Document 开始标记,EOF是结束标记- 单引号防止变量替换,双引号允许变量替换
EOF
:结束标记,必须单独一行
命令执行和检查
CONNECTION_STATUS=$(iw dev $INTERFACE link) # 执行命令并保存输出
if ! iw dev | grep -q "$INTERFACE"; then # 命令失败时(! 表示取反)
定时任务 crontab
sudo crontab -e # 编辑定时任务
*/1 * * * * /path/to/script.sh # 每分钟执行一次
crontab -e
:编辑当前用户的定时任务*/1 * * * *
:时间格式(分 时 日 月 周)*/1
:每分钟
4.4 脚本使用方法详解
创建和运行脚本
- 创建脚本文件:
sudo nano /usr/local/bin/wifi-check.sh
- 设置执行权限:
sudo chmod +x /usr/local/bin/wifi-check.sh
- 运行脚本:
sudo /usr/local/bin/wifi-check.sh
或sudo ./wifi-check.sh
权限说明
chmod +x
:给文件添加可执行权限sudo
:以管理员权限运行,因为网络配置需要高权限./script.sh
:当前目录下执行脚本
脚本作用说明
脚本中的变量如 INTERFACE="wlan0"
的作用:
- 方便修改:只需改一处就能改变整个脚本的行为
- 代码可读:变量名比硬编码的值更易理解
- 减少错误:避免在多处重复输入可能出错
5. 串口环境使用
5.1 直接命令输入
在 Linux 串口终端中,所有 iw
命令都可以直接输入:
这些命令可以直接在串口终端执行:iw dev
、iw dev wlan0 scan
、iw dev wlan0 connect "MyWiFi"
、iw dev wlan0 link
5.2 脚本执行方式
方式1:直接粘贴执行(简单命令)
可以直接在串口中逐行输入:
iw dev wlan0 disconnect
sleep 2
iw dev wlan0 connect "MyWiFi"
iw dev wlan0 link
方式2:创建临时脚本
在串口中创建临时脚本:
cat > /tmp/wifi-connect.sh << 'EOF'
#!/bin/bash
iw dev wlan0 scan | grep "MyWiFi"
if [ $? -eq 0 ]; theniw dev wlan0 connect "MyWiFi"echo "连接命令已发送"
elseecho "未找到目标网络"
fi
EOFchmod +x /tmp/wifi-connect.sh
/tmp/wifi-connect.sh
6. 常用命令速查
6.1 快速连接
扫描并连接:iw dev wlan0 scan | grep -i "mywifi"
然后 iw dev wlan0 connect "MyWiFi"
6.2 状态检查
一键检查状态:iw dev wlan0 link && echo "已连接" || echo "未连接"
6.3 信号监控
持续监控信号(Ctrl+C 退出):
while true; do iw dev wlan0 link | grep signalsleep 2
done
6.4 热点检查
查看周围热点:iw dev wlan0 scan | grep -E "(SSID|signal|freq)"
7. 故障排查
7.1 常见问题诊断
检查驱动是否正常:lsmod | grep -i wireless
和 dmesg | grep -i wireless
检查接口状态:ip link show wlan0
和 iw dev wlan0 info
检查无线功能:rfkill list
7.2 重置网络接口
完全重置无线接口:
ip link set wlan0 down
iw dev wlan0 set type managed
ip link set wlan0 up