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

相关推荐
LZQqqqqo23 分钟前
WinForm 对话框的 Show 与 ShowDialog:阻塞与非阻塞的抉择
服务器·windows·microsoft·winform
科大饭桶43 分钟前
Linux系统编程Day9 -- gdb (linux)和lldb(macOS)调试工具
linux·服务器·c语言·c++
awei09161 小时前
如何将服务器中的Docker镜像批量导出?
服务器·docker·云原生·容器
绵绵细雨中的乡音2 小时前
Linux多线程——生产者消费者模型
linux
武汉格发Gofartlic2 小时前
HFSS许可证常见问题及解决方案
大数据·运维·人工智能·数据分析·自动化
运维行者_2 小时前
多数据中心运维:别让 “分布式” 变成 “混乱式”
运维·数据库·分布式·测试工具·自动化·负载均衡·故障告警
花小璇学linux4 小时前
imx6ull-驱动开发篇14——原子操作
linux·驱动开发·嵌入式软件
君科程序定做4 小时前
Linux 内核发包流程与路由控制实战
linux·运维·服务器
Lovyk4 小时前
NFS 服务器
linux·服务器
遇见尚硅谷11 小时前
C语言:20250805学习(文件预处理)
服务器·c语言·学习