如何使用命令行连接到WPA wifi网络?

所以基本上,我想在不在X环境中时使用来连接我的WiFi网络。但是我在man手册中没有找到方法。有什么建议吗?

相关链接:用于轻松更改实际连接的无线网络的命令行工具? 在软件推荐 SE 上。 - kenorb
9个回答

iw(列表/配置)只能处理WEP。

您需要wpasupplicant软件包,该软件包提供wpa_supplicant命令,如果需要,请通过sudo apt-get install wpasupplicant进行安装。

将您的SSID和密码放入/etc/wpa_supplicant.conf文件中(需要使用sudo权限)。

示例:

network={
    ssid="ssid_name"
    psk="password"
}

假设您的接口是wlan0,您可以使用以下方式连接:
sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf -D wext
sudo dhclient wlan0

"wext"是一个驱动程序,对于每张卡都是特定的;请参考wpa_supplicant -h。示例:
hostap (default) Host AP driver (Intersil Prism2/2.5/3). (this can also be used with Linuxant DriverLoader).
hermes Agere Systems Inc. driver (Hermes-I/Hermes-II).
madwifi MADWIFI 802.11 support (Atheros, etc.).
atmel ATMEL AT76C5XXx (USB, PCMCIA).
wext Linux wireless extensions (generic).
ndiswrapper Linux ndiswrapper.
broadcom Broadcom wl.o driver.
ipw Intel ipw2100/2200 driver.
wired wpa_supplicant wired Ethernet driver
roboswitch wpa_supplicant Broadcom switch driver
bsd BSD 802.11 support (Atheros, etc.).
ndis Windows NDIS driver.

好吧,很高兴iwlist/iwconfig只能处理WEP加密,但在我的情况下,wpa_supplicant -B -iwlan0 -c/etc/wpa_supplicant.conf -Dwext && dhclient wlan0无法连接到无线网络,尽管默认情况下NetworkManager会将我连接到所需的网络。我想尝试使用命令行方式,是否有什么错误我犯了? - Registered User
最后一个命令实际上是两个命令,你需要以root(系统管理员)身份运行它们。所以可以使用以下命令:sudo wpa_supplicant -B -iwlan0 -c/etc/wpa_supplicant.conf -Dwext && sudo dhclient wlan0 或者将它们分成两个命令,使用&&进行分隔。 - Anders
1这个解决方案给我报了一个错误:“wlan0: 不支持的驱动程序 'ext'”。 - Cerin
@cerin 你知道这是用于WPA而不是WEP的吧 ;) - Rinzwind
1@Rinzwind,是的...查看wpa_supplicant的man页可以发现驱动程序可能会有所不同,因此您的命令可能不会像字面上给出的那样工作。您必须为特定硬件选择-D<driver>。对我来说,最终选择的是"nl80211"。 - Cerin
啊,好主意 :) 我会改的。Wext是Linux的通用驱动程序,所以往往能够正常工作 :) - Rinzwind
1我完全忽略了-D选项,它起作用了!谢谢! :) - Ray
1命令'sudo dhclient wlan0'返回了吗?在我这里它是被阻止的。这样可以吗? - ka3ak
在17.04 @ka3ak?如果是的话...很可能不是"wlan0"...我们已经切换到命名设备。 - Rinzwind
还有一件事.. 选项和参数之间没有空格。例如,wpa_supplicant -Dwext -ieth1 -c/root/wpa.conf - Kayes
把密码以明文存储起来,真是一个糟糕的建议。这正是wpa_passphrase的用途所在。 - BЈовић

这个链接展示了所有内容,并且对我来说运行良好:http://linux.icydog.net/wpa.php 我在这里复制内容,以防那个网站离线。
命令行WPA
有时候你会在命令行界面上没有访问GUI网络工具的权限,但是你的接入点受到WPA保护。你该怎么办?
假设你的无线网卡实际上是工作的(即iwconfig可以看到它并与之交互),使用wpa_supplicant其实非常简单。 安装wpa_supplicant
大多数发行版现在默认安装了wpa_supplicant。如果你可以使用wpa_passphrase和wpa_supplicant命令,那么你就可以开始了。否则,你需要通过类似以下方式安装该软件包(对于Ubuntu):
$ sudo apt-get install wpasupplicant

或(对于 Fedora):
# yum install wpa_supplicant

或者根据您的发行版使用相应的命令。
生成配置文件
既然wpa_supplicant已经安装好了,我们将创建它的配置文件。一旦您知道SSID和WPA密码,您只需要运行以下命令:
$ wpa_passphrase myrouter mypassphrase > wpa.conf

当然,将“myrouter”替换为您的路由器的SSID,“mypassphrase”替换为您的WPA密码短语,“wpa.conf”替换为您想要存储配置的文件。此文件名不必遵循特定格式或具有特定扩展名。
另外,为了避免在命令行上输入密码短语(以防止其保存在shell历史记录中),您可以只在命令行上指定SSID。wpa_passphrase将等待您输入密码短语,然后按回车键:
$ wpa_passphrase myrouter > wpa.conf
mypassphrase

你最终应该得到一个看起来像这样的文件:
network={
    ssid="myrouter"
    #psk="mypassphrase"
    psk=8ada1f8dbea59704ac379538b4d9191f6a72390581b4cd7a72864cea685b1a7f
}

建立连接

现在我们将实际运行wpa_supplicant来连接到无线网络。首先,如果您的路由器广播其SSID(默认情况下都会),您可能希望确保您的无线网卡能够看到它:

$ iwlist scan

你可能需要以 root 用户身份运行以强制刷新。

接下来,您需要知道三个信息:

  1. 要为您的无线网卡使用哪个 wpa_supplicant 无线驱动程序。运行 wpa_supplicant --help 列出了它所拥有的不同驱动程序(在 "drivers:" 下方)。从0.5.8版本开始,有用的选择是: wexthostapmadwifiatmelndiswrapperipw(ipw 仅适用于旧内核;>=2.6.13 应使用 wext)。如果您没有看到与您的网卡完全匹配的选项,请尝试使用 wext,因为它是一个综合性的选择。
  2. 您的网卡的网络设备。通常为 eth1 或 wlan0,但如果您不确定,可以直接运行 iwconfig。对于非无线设备,它将报告 "no wireless extensions",而对于任何无线设备,它将显示一些数据。
  3. 您在上一步中创建的配置文件的路径。

现在,您已经获得了这些数据,以 root 用户身份运行以下命令:

# wpa_supplicant -D[driver] -i[device] -c[/path/to/config]

选项和参数之间没有空格。不要包括括号,我只是为了清晰起见才添加的。例如,对于我的笔记本电脑,它看起来像这样:
# wpa_supplicant -Dwext -ieth1 -c/root/wpa.conf

你还可以使用-B选项在后台运行它,这样就不会占用你的控制台。
现在你已经连接到网络了。
上网
要真正上网,你需要获取一个IP地址。大多数人只想从DHCP服务器获取一个动态IP地址,可能是路由器内置的那个。(我不打算涉及设置静态IP和路由表,因为那是一个庞大的主题。)
要获取一个DHCP租约,首先释放你仍然持有的任何租约(以root身份):
# dhclient -r

然后要求一个新的租约(当然,用您网络设备的名称eth1来替换,与您在上一节中使用的相同名称)。
# dhclient eth1

你现在拥有一个IP,至少在理论上。愉快冲浪!

1对于没有经验的人来说,大多数无线网卡接口的名称将会是wlan<number>,所以例如你配置中的第一个无线网卡将会是wlan0,而不是eth1。 - xorinzor
谢谢,wpa_passphrase命令真是帮了大忙。我试过了接受的答案,但文件有问题,幸好wpa_passphrase解决了这个问题,然后我就按照接受的答案传递了第二个命令(我确信它被称为wlan0)。 - Lilian A. Moraru
谢谢,那真的太好了!你能给我一个关于如何设置静态和路由表的链接吗? :) - Yassine
1@AlexandreSchmidt 给你点赞,因为你的回答很全面! - John Strood
1@JohnStrood 严格来说,你应该感谢写这个网站的人,因为它是从那里复制过来的。 - icc97
是的,@JohnStrood,这是一份副本,正如第一句所述。这是一个建议,你不仅仅指向链接,因为链接的网站可能会关闭,答案也会丢失。更多信息请参考:https://meta.stackexchange.com/questions/225370/your-answer-is-in-another-castle-when-is-an-answer-not-an-answer - Alexandre Schmidt
wpa_passphrase似乎只能为WPA-Personal(或WPA-PSK)生成配置文件,而不能为WPA-Enterprise生成配置文件。 - robertspierre

Debian和其他发行版默认会运行wpa_supplicant作为服务来管理Wi-Fi网络。wpa_supplicant可以通过不同的客户端/前端(如网络管理器GUI)进行操作。这在这个debian wiki中有更详细的解释。
wpa_cli是命令行下的wpa_supplicant客户端,用于管理Wi-Fi网络。 编辑:我刚刚找到了这篇文章,解释了如何使用nmcli,它比wpa_cli要好得多,因为它与GUI网络管理器以及它们的设置和保存的Wi-Fi网络兼容。 wpa_cli的用法示例: 检查我已经启用了一个Wi-Fi接口的网络:
# iwconfig
wlan0     IEEE 802.11bgn  ESSID:off/any  
          Mode:Managed  Access Point: Not-Associated   Tx-Power=22 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:on

检查wpa_supplicant进程是否正在运行:
# ps -e | grep wpa
1881 ?        00:00:07 wpa_supplicant

进入WPA客户端交互模式:
# wpa_cli

列出可用接入点:
> scan
> scan_results

...然后你会得到这样的东西:

bssid / frequency / signal level / flags / ssid
e0:60:66:7c:81:7f       2417    -66     [WPA2-PSK-CCMP][ESS]    vodafone817E
e0:60:66:61:83:4b       2452    -76     [WPA2-PSK-CCMP][WPS][ESS]       vodafone834A
f8:8e:85:c5:65:c2       2462    -76     [WPA-PSK-CCMP+TKIP][WPS][ESS]   MOVISTAR_65C1
a8:d3:f7:46:0c:be       2472    -83     [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]       Orange-0CBC
...

添加你的AP:
> add_network
> set_network 0 ssid "vodafone817E"
> set_network 0 psk "my-pass-phrase"

选择它为当前:

> enable_network 0

连接到它:
> reconnect

检查状态:

> status

退出wpa_cli:
> quit

从命令行中,请求DHCP获取IP地址和网络设置:
# dhclient -r
# dhclient wlan0

为什么你谈论 wpa_cli 然后写成 wpa_client?在 Kubuntu 18.10 中似乎没有 wpa_client 这个命令。 - robertspierre
你是对的...已修复。 - David

所有提到 wpa_supplicant 的答案都是错误的。是的,它可能会连接到 WPA 网络,但从长远来看,这是一个不好的解决方案,因为它在维护上会非常困难,并且不能很好地与有线连接兼容。阅读this answer并通过使用命令行中的 Network Manager 让生活变得更轻松。我浪费了几个小时尝试配置 wpa_supplicant,然后尝试了 nmcli,结果 "就可以工作"。

4事情“只是工作”的问题在于它们很容易“不工作”,那时你会怎么办呢?对于命令行界面的人来说,直接使用wpa_supplicant方法更好,因为它暴露了所有的部分。NM的伟大之处在于它把所有的部分都隐藏起来。所以说wpa_supplicant方法是错误的是不正确的。你喜欢“只是工作”的东西,没问题。你有权利偏好自己的选择,但告诉别人他们错了只因为他们的偏好与你不同是不礼貌的。这就是为什么我给你的回答点了个踩。 - Stephen Boston

实际上,如果你安装了checkbox软件包,可以使用NetworkManager来完成这个任务。
sudo /usr/share/checkbox/create_connection SSID --security=wpa -key=WPA-KEY

(来源:错误 923836,这是我在该主题上搜索时找到的。)

你可以使用VSWM - 非常简单的无线网络管理器。你可以将已知的接入点放在一个简单的配置文件(/etc/vswm.cfg)中,当你运行vswm时,它会扫描可用的网络并连接你的卡与首次出现在/etc/vswm.cfg上的网络。
VSWM可以在https://github.com/dmelo/vswm下载。这是一个vswm.cfg配置文件的示例:
[global]

dev = wlan0
dns = ["4.2.2.1","8.8.8.8"]

[wlan0-0]

ssid = Network1
psk = netpassword
protocol = WPA
net = dhcp

[wlan0-1]

ssid = Network2
protocol = WEP
net = static
address = 192.168.0.15/24

在底层,它使用标准的命令行工具:iwlist、wpa_supplicant、iwconfig、dhclient... 只是它自动化了这项工作。


nmcli是Ubuntu上默认网络管理应用的命令行版本。

它的一些优点是它使用你已经在图形界面中配置好的设置,并且不需要root访问权限。

你可以运行nmcli来显示可用选项。

连接到名为MYESSID的wifi的示例:

    nmcli c up MYESSID   

1nmcli,nm-applet,是的,你的答案是最好的,但我不知道为什么没有人投票。 - SdSaati

我在直接使用wpa_supplicant连接无线网络时遇到了麻烦。当我在wpa_supplicant命令行上使用wpa_supplicant.conf文件时,我的网络ID和密码会产生错误。
sudo wpa_supplicant -iwlan0 -c/etc/wpa_supplicant.conf -B

我能够通过使用 wpa_cli 来解决这个问题。由于我在 Linux ndiswrapper 中使用的是 Windows 驱动程序,所以我需要使用以下命令序列:
sudo modprobe ndiswrapper
sudo iwconfig wlan0 essid "<My Network ID>" mode managed
sudo wpa_cli identity "<My Network ID>" password "<My password>"

我通过在图形用户界面的网络部分中添加它来设置了网络,这样我就可以点击有线或无线网络图标,并选择无线提供商(有时需要完成登录)。

如果您的卡片未运行,请先启动它:

ifconfig wlan0 up

根据您的网络设置参数。
iwlist wlan0 scan
iwconfig wlan0 essid NETWORK_ID key WIRELESS_KEY

16我相信这只适用于WEP,没有WPA ;) - Rinzwind
林兹温德是对的。这是为WEP而准备的。对于错误,我很抱歉。 - LnxSlck
2没问题。把它留在这里,总会有人从你的回答中受益的 ;) - Rinzwind
没有密码,这个网络还能用吗? - EvoandroidEvo
当然,只需不设置密钥。 - LnxSlck
1希望没有人从一个WEP特定的答案中受益 :'( - bot47