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

相关推荐
正在努力的小河8 小时前
Linux并发与竞争
linux·运维·服务器
三坛海会大神5559 小时前
正则表达式与grep文本过滤详解
linux·运维·正则表达式
fuyongliang1239 小时前
Linux 正则表达式与grep命令
服务器·数据库·mysql
码农hbk11 小时前
Linux signal 图文详解(二)信号发送
linux·服务器
東雪蓮☆11 小时前
Shell 编程 —— 正则表达式与文本处理实战
linux·运维·服务器
叁仟叁佰11 小时前
Shell脚本编程:函数、数组与正则表达式详解
运维·服务器·网络·chrome·正则表达式
Gary Studio12 小时前
Linux-驱动积累
linux
电气铺二表姐1377441661512 小时前
【WIFI电表】物联网无线通讯光伏储能三相单相智能电表
运维·人工智能·能源
lin张13 小时前
函数、数组与 grep + 正则表达式的 Linux Shell 编程进阶指南
linux·运维
苏三福14 小时前
交叉编译linux-arm32位程序
linux·运维·服务器