如何在 Linux 上使用 rfkill 命令管理 WiFi 接口
Rfkill 是绝大多数 Linux 发行版中都可用的实用程序,并且通常默认安装。该实用程序允许我们在 Linux 上列出、启用或禁用各种类型的无线接口,例如 WIFI 或蓝牙。
在本教程中,我们将了解如何使用它,以及我们可以传递来修改其行为的最有用的选项是什么。
在本教程中您将学习:
如何列出无线接口
如何通过 ID 启用或禁用无线接口
如何按类型启用或禁用无线接口
如何切换无线接口的状态
如何在没有管理权限的情况下运行 rfkill
使用的软件要求和约定
列出无线接口
我们可以使用 rfkill 执行的最基本的操作是列出计算机上所有可用的无线接口。要完成此操作,我们所要做的就是调用该实用程序而不指定任何选项或参数:
$ sudo rfkill
以下是该命令在我的机器上产生的输出:
ID TYPE DEVICE SOFT HARD
0 bluetooth tpacpi_bluetooth_sw unblocked unblocked
2 wlan phy0 unblocked unblocked
5 bluetooth hci0 unblocked unblocked
正如我们所看到的,程序的输出是按列组织的。在默认显示的第一列ID中,我们可以看到设备标识符值;在第二个TYPE中,我们可以找到设备类型;例如,在这种情况下,我们可以区分蓝牙和 WLAN 接口。第三列DEVICE报告内核设备名称。最后两列分别报告接口的软和硬块的状态。
另一列可用,但默认情况下不包含:TYPE-DESC,它报告设备类型的描述。为了使其包含在 rfkill 的输出中,或者更一般地指定应包含在其中的列,我们可以使用 -o
选项(这是 的简短版本) --output
),并提供以逗号分隔的列列表作为参数(显示所有可用列的快捷方式是 --output-all
) 。
让我们看一个例子:假设我们只想在 rfkill 的输出中包含 ID、TYPE-DESC、SOFT 和 HARD 列。以下是我们调用该程序的方式:
$ sudo rfkill -o ID,TYPE-DESC,SOFT,HARD
这是我们将获得的输出:
ID TYPE-DESC SOFT HARD
0 Bluetooth unblocked unblocked
2 Wireless LAN unblocked unblocked
4 Bluetooth unblocked unblocked
我们还可以使用其他选项来格式化 rfkill 生成的输出。例如,我们可以让程序生成 JSON 格式的输出。我们所要做的就是使用 -J
或 --json
选项调用它:
{
"rfkilldevices": [
{
"id": 0,
"type": "bluetooth",
"device": "tpacpi_bluetooth_sw",
"soft": "unblocked",
"hard": "unblocked"
},{
"id": 2,
"type": "wlan",
"device": "phy0",
"soft": "unblocked",
"hard": "unblocked"
},{
"id": 5,
"type": "bluetooth",
"device": "hci0",
"soft": "unblocked",
"hard": "unblocked"
}
]
}
在某些情况下,获取 JSON 格式的输出可能很有用,因为可以使用我们选择的编程语言轻松解析 JSON。例如,使用 Python 解析 JSON 文件非常简单!
阻止、取消阻止和切换无线接口的状态
一旦我们获得了机器上可用无线接口的列表,使用 rfkill 管理它们的状态就非常容易了。我们可以阻止、取消阻止或更一般地切换通过 ID 引用它的接口的状态。让我们看一些例子。
通过 ID 阻止接口
无线接口可以是两种类型的块的主题:软件和硬件。 “硬”块状态无法通过软件更改,通常是由硬件开关执行的块,或者在特定情况下通过机器固件实现:例如,在某些机器上,当 LAN 时可以禁用 wifi 接口电缆已连接。
相反,“软”阻止是通过软件执行的,我们可以使用 rfkill 设置其状态。假设我们要禁用上一个示例中 ID 为 0 的蓝牙接口。以下是我们要运行的命令:
$ sudo rfkill block 0
该设备现在被报告为“软阻止”:
ID TYPE DEVICE SOFT HARD
0 bluetooth tpacpi_bluetooth_sw blocked unblocked
2 wlan phy0 unblocked unblocked
按类型阻止接口
使用 rfkill,我们不仅可以通过设备 ID 来引用设备,还可以通过 TYPE 列中报告的值来引用设备。如果我们想同时阻止或取消阻止多个设备,这会很有用。例如,假设我们想用一个命令阻止所有可用的蓝牙设备;这是我们要运行的:
$ sudo rfkill block bluetooth
解锁接口
使用 rfkill 解锁一个或多个接口同样简单。我们所要做的就是使用“unblock”命令而不是“block”。假设我们想要解锁在上一个示例中阻止的蓝牙设备,我们将运行:
$ sudo rfkill unblock 0
要取消阻止所有蓝牙设备,请改为:
$ sudo rfkill unblock bluetooth
切换接口状态
通过使用“toggle”命令,我们可以切换接口的状态,而无需明确指定。如果接口被阻止,则该接口将被解除阻止,反之亦然。例如,要切换 ID 为 0 的接口的状态,我们将运行:
$ sudo rfkill toggle 0
在没有管理权限的情况下运行 rfkill
在 Debian 和 Ubuntu 等发行版上,或更一般地在未进行其他配置的情况下,要使用 rfkill 列出可用的无线接口并更改其状态,因此要软阻止或取消阻止它们,必须使用管理权限调用 rfkill,方法是在命令前面加上前缀使用 sudo,或者直接以 root 用户身份调用它。然而,在最新版本的 Fedora 上,可以通过以普通用户身份启动命令来执行这些操作。为什么会出现这种情况?
Linux 内核公开的 rkill 用户界面是 /dev/rfkill
字符设备。如果我们通过运行 ls 查看该设备的权限,我们可以看到权限符号中报告了一个 +
符号:
$ ls -l /dev/rfkill
crw-rw-r--+ 1 root root 10, 242 Mar 22 09:18 /dev/rfkill
+
符号表示该文件应用了 ACL 扩展属性。要获取更多信息,我们可以使用 getfacl 命令:
$ getfacl /dev/rfkill
我们得到以下输出:
# file: dev/rfkill
# owner: root
# group: root
user::rw-
user:doc:rw-
group::rw-
mask::rw-
other::r--
正如您所看到的,默认情况下,除了标准的 unix 权限之外,“doc”用户(即我在计算机上的用户名)还存在文件的特定 rw
权限。这是由发行版自动完成的,这就是为什么我们可以在没有权限升级的情况下启动它。如果我们想从文件中删除这些特殊权限,我们可以简单地运行以下命令:
$ sudo setfacl -b /dev/rfkill
如果您想了解有关 Linux 上的 ACL 的更多信息,可以查看我们关于该主题的介绍性教程。
结论
在本教程中,我们学习了如何使用 rfkill 获取计算机上可用的无线接口列表,并了解了如何阻止、取消阻止以及切换其状态。最后我们看到了如何以标准用户身份使用 rfkill,而不需要特殊权限。