iw 命令 -- linux 无线管理

iw 命令入门

  • [1. 概述](#1. 概述)
    • [1.1 基本概念](#1.1 基本概念)
  • [2. iw --help 命令分析](#2. iw --help 命令分析)
  • [3. 核心命令](#3. 核心命令)
    • [3.1 查看](#3.1 查看)
    • [3.2 扫描](#3.2 扫描)
    • [3.3 连接](#3.3 连接)
    • [3.4 接口管理](#3.4 接口管理)
  • [4. 实用脚本](#4. 实用脚本)
  • [5. 串口环境使用](#5. 串口环境使用)
    • [5.1 直接命令输入](#5.1 直接命令输入)
    • [5.2 脚本执行方式](#5.2 脚本执行方式)
  • [6. 常用命令速查](#6. 常用命令速查)
    • [6.1 快速连接](#6.1 快速连接)
    • [6.2 状态检查](#6.2 状态检查)
    • [6.3 信号监控](#6.3 信号监控)
    • [6.4 热点检查](#6.4 热点检查)
  • [7. 故障排查](#7. 故障排查)
    • [7.1 常见问题诊断](#7.1 常见问题诊断)
    • [7.2 重置网络接口](#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\] \[\ \[\\]\] \[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>] 是可选参数
bash 复制代码
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

bash 复制代码
#!/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"; then
    log_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"; then
            echo "重连成功!"
            log_message "重连成功到 $SSID"
        else
            echo "重连失败"
            log_message "重连失败到 $SSID"
        fi
    else
        echo "找不到网络 $SSID"
        log_message "扫描未找到网络 $SSID"
    fi
fi

4.2 脚本2:WiFi 热点创建器

文件:保存为 /usr/local/bin/create-hotspot.sh

bash 复制代码
#!/bin/bash

# WiFi 热点创建脚本
# 用途:快速创建一个简单的 WiFi 热点用于测试

HOTSPOT_NAME="TestHotspot"
CHANNEL="6"
INTERFACE="wlan0"

echo "=== WiFi 热点创建器 ==="

# 检查是否以 root 运行
if [ "$EUID" -ne 0 ]; then
    echo "错误:此脚本需要 root 权限运行"
    echo "请使用:sudo $0"
    exit 1
fi

# 检查接口是否存在
if ! iw dev | grep -q "$INTERFACE"; then
    echo "错误:接口 $INTERFACE 不存在"
    echo "可用接口:"
    iw dev | grep Interface | cut -d' ' -f2
    exit 1
fi

# 检查接口是否支持 AP 模式
if ! iw list | grep -A10 "Supported interface modes" | grep -q "AP"; then
    echo "错误:硬件不支持 AP 模式"
    exit 1
fi

echo "1. 断开现有连接..."
iw dev $INTERFACE disconnect 2>/dev/null

echo "2. 设置接口为 AP 模式..."
if ! iw dev $INTERFACE set type ap; then
    echo "错误:无法设置 AP 模式"
    exit 1
fi

echo "3. 启动网络接口..."
ip link set $INTERFACE up

echo "4. 设置工作信道 $CHANNEL..."
if ! iw dev $INTERFACE set channel $CHANNEL; then
    echo "错误:无法设置信道"
    exit 1
fi

echo "5. 分配 IP 地址..."
ip addr add 192.168.10.1/24 dev $INTERFACE

echo "=== 热点配置完成 ==="
echo "热点名称:$HOTSPOT_NAME"
echo "工作信道:$CHANNEL"
echo "接口地址:192.168.10.1"
echo ""
echo "注意:这只是基础配置"
echo "完整热点功能需要配置 hostapd 和 dnsmasq"
echo ""
echo "查看接口状态:"
iw dev $INTERFACE info

echo ""
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 来执行这个脚本

变量定义和使用

bash 复制代码
INTERFACE="wlan0"        # 定义变量
echo "$INTERFACE"        # 使用变量,$符号取值
echo "${INTERFACE}_backup"  # 花括号避免歧义

条件判断语法

bash 复制代码
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  # 检查文本包含某个词

权限检查详解

bash 复制代码
if [ "$EUID" -ne 0 ]; then
    echo "需要 root 权限"
    exit 1
fi
  • $EUID:当前用户的有效用户ID,root用户ID是0
  • -ne:不等于(not equal)
  • exit 1:退出脚本,返回错误码1

Here Document 语法

bash 复制代码
cat > /tmp/wifi-connect.sh << 'EOF'
#!/bin/bash
echo "Hello World"
EOF
  • cat >:将内容写入文件
  • << 'EOF':Here Document 开始标记,EOF是结束标记
  • 单引号防止变量替换,双引号允许变量替换
  • EOF:结束标记,必须单独一行

命令执行和检查

bash 复制代码
CONNECTION_STATUS=$(iw dev $INTERFACE link)  # 执行命令并保存输出
if ! iw dev | grep -q "$INTERFACE"; then     # 命令失败时(! 表示取反)

定时任务 crontab

bash 复制代码
sudo crontab -e                    # 编辑定时任务
*/1 * * * * /path/to/script.sh     # 每分钟执行一次
  • crontab -e:编辑当前用户的定时任务
  • */1 * * * *:时间格式(分 时 日 月 周)
  • */1:每分钟

4.4 脚本使用方法详解

创建和运行脚本

  1. 创建脚本文件:sudo nano /usr/local/bin/wifi-check.sh
  2. 设置执行权限:sudo chmod +x /usr/local/bin/wifi-check.sh
  3. 运行脚本:sudo /usr/local/bin/wifi-check.shsudo ./wifi-check.sh

权限说明

  • chmod +x:给文件添加可执行权限
  • sudo:以管理员权限运行,因为网络配置需要高权限
  • ./script.sh:当前目录下执行脚本

脚本作用说明

脚本中的变量如 INTERFACE="wlan0" 的作用:

  • 方便修改:只需改一处就能改变整个脚本的行为
  • 代码可读:变量名比硬编码的值更易理解
  • 减少错误:避免在多处重复输入可能出错

5. 串口环境使用

5.1 直接命令输入

在 Linux 串口终端中,所有 iw 命令都可以直接输入:

这些命令可以直接在串口终端执行:iw deviw dev wlan0 scaniw 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:创建临时脚本

在串口中创建临时脚本:

bash 复制代码
cat > /tmp/wifi-connect.sh << 'EOF'
#!/bin/bash
iw dev wlan0 scan | grep "MyWiFi"
if [ $? -eq 0 ]; then
    iw dev wlan0 connect "MyWiFi"
    echo "连接命令已发送"
else
    echo "未找到目标网络"
fi
EOF

chmod +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 退出):

bash 复制代码
while true; do 
    iw dev wlan0 link | grep signal
    sleep 2
done

6.4 热点检查

查看周围热点:iw dev wlan0 scan | grep -E "(SSID|signal|freq)"

7. 故障排查

7.1 常见问题诊断

检查驱动是否正常:lsmod | grep -i wirelessdmesg | grep -i wireless

检查接口状态:ip link show wlan0iw dev wlan0 info

检查无线功能:rfkill list

7.2 重置网络接口

完全重置无线接口:
ip link set wlan0 down
iw dev wlan0 set type managed
ip link set wlan0 up

相关推荐
代码的余温23 分钟前
XML vs JSON:核心区别与最佳选择
xml·服务器·json
古井无波 202430 分钟前
低精度定时器 (timer_list) 和 高精度定时器 (hrtimer)
linux
SMiLe34 分钟前
使用PTP解决网络中多设备的时间同步问题
linux
S,D38 分钟前
MCU进入低功耗模式前的引脚处理原则和方法 --> 以最小化低功耗电流
驱动开发·stm32·单片机·嵌入式硬件·mcu·standby·低功耗引脚处理
Cyber4K43 分钟前
轻轻松松带你进行-负载均衡LVS实战(文章后)
运维·实战·负载均衡·lvs
山烛1 小时前
小白学HTML,操作HTML网页篇(1)
运维·服务器·前端·python·html
是小pa丫1 小时前
ubuntu系统在线安装postgres
linux·运维·ubuntu
ZCQ_dashuaibi2 小时前
HAProxy双机热备,轻松实现负载均衡
运维·服务器·负载均衡
别在内卷了2 小时前
测试学习之——Pytest Day2
服务器·学习·pytest
czhc11400756632 小时前
Linux 716 数据库迁移
linux·数据库