如何在终端手动连接和断开网络?

由于网络管理器给我带来了很多困扰,我想要替换它(可能是从 ppa:volanin 中的 wicdNM)。

我不知道如何在终端中连接和断开网络而不使用网络管理器。

我希望有一种命令行方式来管理网络。


2如果你打算搞弄你系统的网络连接管理器,我建议你在有线以太网连接下进行操作。这样不容易失去连接,并且在需要时更容易通过命令行进行设置。 - Ryan C. Thompson
我使用 wicd-curses,我觉得这是迄今为止最简单的用户界面。你需要使用 <kbd>→</kbd>(右箭头键 ->)来设置配置;其他所有操作都可以从屏幕上的指示中明显看出。 - isomorphismes
5个回答

适用于12.04+版本,因为这些是我可以测试的版本,但也适用于旧版本。我将本指南分为几个部分:

  • 第一部分:没有密码或WEP密钥的无线路由器
  • 第二部分:具有WPA或WPA2安全密钥的无线路由器
    • 第2.1部分:使用wpa_supplicant连接到WPA路由器
    • 第2.2部分:使用网络管理器连接到WPA路由器
  • 第三部分:通过nmcli轻松连接
  • 第四部分:断开与无线路由器的连接
  • 第五部分:删除连接(包括配置文件)
  • 第六部分:登录时自动连接
  • 额外内容:通过图形界面查找网络接口名称的方法

根据无线网卡、无线安全和无线路由器设置,可以使用以下命令行进行连接和断开连接。在继续之前,请确保网络服务已启用(对于可能使用恢复模式启动Ubuntu的情况):

根据您的Ubuntu版本,您需要使用以下一种方式启动它:

如果使用SystemD(自14.10+起):

sudo systemctl start networking

如果使用传统的init.d方式:sudo /etc/init.d/networking restart 如果使用传统的Upstart方式:sudo service network-manager restart 第一部分:没有密码或WEP密钥的无线路由器
对于无线路由器没有密码或WEP安全的情况,请按照以下步骤进行操作:
打开终端并查找无线连接: ``` iwlist wlan0 s ``` (`s` 是扫描的意思。`wlan0` 是我的无线网卡,但对于每个用户可能不同。有些人是 eth0,其他人是 wlan2... 执行此选项需要使用 `sudo`。要找出您的无线网卡名称,只需键入 iwlist 然后按下 `TAB` 键。这应该自动完成带有网络卡名称的行。您还可以键入 `iwconfig` 并在显示的列表中找到名称。)
如果您不知道无线设备的名称,请键入:`iwconfig`,它将显示有线/无线设备及其名称。它们可能是类似 wlan0、wlan1、eth1、eth2 的东西。
查找将显示您可见的所有可能的接入点(AP)。在列表中看到您的路由器后,尝试连接到它:
如果没有密码,请执行以下操作: ``` iwconfig wlan0 essid ACCESS_POINT_NAME ``` 例如: ``` iwconfig wlan0 essid CYREX ``` 之后,确保使用 `dhclient`,以便在路由器未分配给您 IP 地址时获得动态 IP。这样应该能让您连接到 CYREX 路由器。
如果有密码,请执行以下操作: ``` iwconfig wlan0 essid CYREX key PASSWORD ``` 这将使用您提供的密码进行连接。
再次连接后,请执行 `dhclient`,以确保您获得分配的 IP 地址。
始终确保您正确连接,因此执行 `iwconfig` 来确保您的无线网卡已连接到上述提到的 SSID。它应该显示您的设备已连接并分配给您的 IP 地址。如果没有并且出现类似“接口不支持扫描”的错误,请尝试以下两个选项:
- 测试接口是否启动:`sudo ifconfig wlan0 up` - 在进行扫描时尝试添加 `sudo`:`sudo iwlist wlan0 s`
尝试将设备关闭然后重新启动: ``` sudo ifconfig wlan0 down sudo ifconfig wlan0 up ```
第二部分:带有WPA或WPA2安全密钥的无线路由器
对于无线路由器使用WPA/WPA2密码的情况,有几种方法可以实现。我将提到最流行的两种方法:
  1. 打开终端并查找无线连接:

    iwlist wlan0 s  
    

    (s 代表扫描。 wlan0 是我的无线网卡,但对于每个用户可能不同。有些人是eth0,其他人是wlan2.. 执行此选项需要使用 sudo。要找出您的无线网卡名称,只需键入 iwlist 然后按下 TAB 键。这将自动完成网络卡名称的行。您还可以键入 iwconfig 并在显示的列表中找到名称。)

    如果您不知道无线设备的名称,请键入: iwconfig,它将显示有线/无线设备及其名称。它们可能是类似 wlan0、wlan1、eth1、eth2 的东西。

  2. 查找结果将显示您可见的所有可能的接入点(AP)。在列表中看到您的路由器后,尝试连接到它:

第2.1部分 WPA-SUPPLICANT指南:使用wpa_supplicant连接到WPA路由器
1. 在终端中输入以下命令(假设您已安装了`wpasupplicant`软件包,该软件包安装了我们将在此处使用的所有必需命令): ``` wpa_passphrase SSID PASSWORD > CONFIG_FILE ``` 示例:`wpa_passphrase Virus LinuxFTW > wpa.conf`
其中,`Virus`是我的路由器名称,`LinuxFTW`是我的密码,`wpa.conf`是我想要存储所有这些信息的文件。请注意,您可以将文件保存在其他位置,许多用户将文件保存在`/etc/wpa_supplicant.conf`而不是`wpa.conf`中。wpa.conf文件的数据应如下所示: ``` network={ ssid="Virus" #psk="LinuxFTW" psk=1d538d505f48205589ad25b2ca9f52f9cbb67687e310c58a8dd940ccc03fbfae } ```
2. 到目前为止,我们应该知道无线网卡接口的名称(例如:Wlan0、eth2、Wlan2...)。现在我们需要知道正在使用哪个驱动程序。我们输入以下命令: ``` wpa_supplicant ``` 它应该会显示很多信息,但是会有一个名为**Drivers**的部分,显示所有可用的驱动程序(这些在编译`wpa_supplicant`时可用)。在我的情况下,它是这样的: ``` drivers: wext = Linux wireless extensions (generic) nl80211 = Linux nl80211/cfg80211 wired = Wired Ethernet driver none = no driver (RADIUS server/WPS ER) ``` 整个列表是hostap、hermes、madwifi、wext、broadcom、wired、roboswitch、bsd、ndis。这可能会根据`wpa_supplicant`的编译方式而有所不同,但在您的系统上显示的应该与我的类似。大多数用户将选择`wext`驱动程序。
3. 现在,我们已经知道了无线接口卡的名称和驱动程序名称,我们可以使用已创建的配置文件连接到它,格式如下: ``` wpa_supplicant -iINTERFACE_NAME -cCONFIGURATION_FILE -DDRIVER_NAME ``` 例如: ``` wpa_supplicant -iwlan0 -c/etc/wpa_supplicant.conf -Dwext ``` 其中,`-i`是您的接口卡名称,`-c`是您的配置文件位置,`-D`是您将用于连接的驱动程序的名称。如果连接成功,我们按下CTRL+C取消它,然后再次执行该行命令,但这次我们使用`-B`将其发送到后台,以便我们可以继续使用终端: ``` wpa_supplicant -B -iwlan0 -c/etc/wpa_supplicant.conf -Dwext ``` 之后,只需执行`sudo dhclient wlan0`以从路由器获取IP地址。
4. 一些用户报告称删除哈希并仅保留密码在配置中,例如: ``` network={ ssid="Virus" psk="LinuxFTW" } ``` 其他人则在配置文件中添加了ssid_scan: ``` network={ ssid="Virus" scan_ssid=1 #psk="LinuxFTW" psk=1d538d505f48205589ad25b2ca9f52f9cbb67687e310c58a8dd940ccc03fbfae } ``` 甚至还可以添加密钥类型: ``` network={ ssid="Virus" scan_ssid=1 key_mgmt=WPA-PSK #psk="LinuxFTW" psk=1d538d505f48205589ad25b2ca9f52f9cbb67687e310c58a8dd940ccc03fbfae } ```
第2.2部分 网络管理器指南:使用网络管理器连接到WPA路由器
网络管理器的好处在于它附带了一些不错的脚本和工具。其中两个是nmcli和create_connection(一个很棒的Python 3脚本),我们将在这种情况下使用它们。
在执行之前提到的步骤以查找路由器的SSID名称(请记住上面关于iwlist的部分)后,我们执行以下操作:
sudo /usr/share/checkbox/scripts/create_connection -S SECURITY_TYPE -K PASSWORD SSID_NAME

其中SECURITY是路由器使用的安全类型(WPA、WEP),PASSWORD是密码,SSID_NAME是路由器的SSID名称。例如:
sudo /usr/share/checkbox/scripts/create_connection -S wpa -K LinuxFTW Virus

将为Network Manager创建一个连接,应该看起来像这样:
$ sudo /usr/share/checkbox/scripts/create_connection -S wpa -K LinuxFTW Virus
[sudo] password for cyrex: 
Connection Virus registered
Connection Virus activated.

之后,您应该从路由器获得一个IP地址。如果没有,请简单地执行sudo dhclient wlan0(假设wlan0是您的接口名称)。您还可以使用nmcli检查网络管理器的连接,如下所示:nmcli c,它应该显示类似于这样的内容:
$ nmcli c
NAME                      UUID                                   TYPE              TIMESTAMP-REAL                    
Xcentral                  f51a5a64-8a91-47d6-897c-28efcd84d2b0   802-11-wireless   Fri 22 Mar 2013 02:25:54 PM VET   
Realtek                   9ded7740-ad29-4c8f-861f-84ec4da87f8d   802-3-ethernet    Tue 05 Mar 2013 01:18:31 AM VET   
Intel                     e25b1fd8-c4ff-41ac-a6bc-22620296f01c   802-3-ethernet    Fri 05 Apr 2013 10:04:05 PM VET   
Virus                     3f8ced55-507b-4558-a70b-0d260441f570   802-11-wireless   Tue 09 Apr 2013 06:31:10 AM VET   

我提到网络管理器的方法,因为有一些情况下使用 wpa_supplicant 将无法工作(路由器和无线网卡之间的问题,安全性问题等)。在我的情况下,所有尝试在一台电脑上使用 wpa_supplicant 都失败了,但在另一台电脑上第一次尝试就成功了。所以我发布这两种方法来帮助每个情况并让用户更容易决定他们想要哪种方法。

第三部分:通过 nmcli 进行简单连接

虽然我们已经讨论了如何在没有网络管理器的情况下连接,但还有一种情况可以使用 nmcli(网络管理器的CLI版本)。要做到这一点,我们需要按照以下步骤操作:

  1. 检查我们能够看到哪个ESSID:

    nmcli dev wifi
    
  2. 验证ESSID的名称,然后在下一行中使用它及其所需的密码(包括WEP和WPA类型的密码):

    nmcli dev wifi connect ESSID_NAME password ESSID_PASSWORD
    

    这是我连接到ESSID Linux5G的示例

    screenshot

    如果您的计算机上有多个无线设备,可以使用ifname参数指定要使用的设备,如下所示:

    nmcli dev wifi connect ESSID_NAME password ESSID_PASSWORD ifname WIRELESS_DEVICE_NAME

    例如,在我的情况下,设备的名称是wlp9s0,因此我会使用此行来指定我将用于连接的设备:

    screenshot

通过使用帮助参数,可以获取有关nmcli的更多信息。例如,如果您想了解有关nmcli dev的信息,您可以键入nmcli dev help。如果您想了解有关nmcli dev wifi的更多信息,您可以键入nmcli dev wifi help,依此类推。

第四部分:断开与无线路由器的连接

有几种方法可以实现这一目标:

  • 强制断开连接: sudo ifconfig wlan0 down

    这将关闭您的无线网卡接口(驱动程序关闭)。要打开它,只需输入ifconfig wlan0 up,然后输入sudo dhclient wlan0。如果通过网络管理器查看,它仍然会显示为已连接,但实际上与路由器没有连接。尝试ping会出现connect: Network is unreachable错误。

  • 释放DHCP IP地址: sudo dhclient -r wlan0

    记得使用sudo dhclient wlan0重新分配IP地址。

  • 使用网络管理器断开连接: nmcli nm enable false

    其中nm是nmcli的参数,用于管理和设置网络管理器的状态。选项enable可以是truefalse,如果设置为false,则所有由网络管理器管理的网络连接都将断开。请注意,nmcli不需要root权限。

要查看网络管理器的状态,请键入nmcli nm,它应该显示类似于以下内容:
      $ nmcli nm
      RUNNING         STATE           WIFI-HARDWARE   WIFI       WWAN-HARDWARE   WWAN      
      running         connected       enabled         enabled    enabled         enabled   

另一种打开或关闭连接(连接/断开连接)的方法是按照以下步骤进行:
nmcli c down id NAME` - Will disconnect the connection NAME  

nmcli c up id NAME` - Will connect the connection NAME

第五部分:删除连接
要删除一个已经存在的连接非常简单。首先在终端输入以下命令:
nmcli c

它将输出类似于这样的内容:
$ nmcli c
NAME                      UUID                                   TYPE              TIMESTAMP-REAL                    
Realtek                   9ded7740-ad29-4c8f-861f-84ec4da87f8d   802-3-ethernet    Tue 05 Mar 2013 01:18:31 AM VET   
PrivateSys                86b2b37d-4835-44f1-ba95-46c4b747140f   802-11-wireless   Sun 21 Apr 2013 07:52:57 PM VET   
pepe                      9887664b-183a-45c0-a81f-27d5d0e6d9d8   802-11-wireless   Thu 18 Apr 2013 02:43:05 AM VET   
Virus                     3f8ced55-507b-4558-a70b-0d260441f570   802-11-wireless   Tue 16 Apr 2013 11:33:24 AM VET   
Intel                     e25b1fd8-c4ff-41ac-a6bc-22620296f01c   802-3-ethernet    Sun 21 Apr 2013 08:12:29 PM VET   
Xcentral                  f51a5a64-8a91-47d6-897c-28efcd84d2b0   802-11-wireless   Fri 22 Mar 2013 02:25:54 PM VET  

现在假设我们想要删除Xcentral,我们可以使用以下命令进行操作:
nmcli c delete id Xcentral

做完后应该看起来像这样:
$ nmcli c delete id Xcentral
$ nmcli c
NAME                      UUID                                   TYPE              TIMESTAMP-REAL                    
Realtek                   9ded7740-ad29-4c8f-861f-84ec4da87f8d   802-3-ethernet    Tue 05 Mar 2013 01:18:31 AM VET   
PrivateSys                86b2b37d-4835-44f1-ba95-46c4b747140f   802-11-wireless   Sun 21 Apr 2013 07:52:57 PM VET   
pepe                      9887664b-183a-45c0-a81f-27d5d0e6d9d8   802-11-wireless   Thu 18 Apr 2013 02:43:05 AM VET   
Virus                     3f8ced55-507b-4558-a70b-0d260441f570   802-11-wireless   Tue 16 Apr 2013 11:33:24 AM VET   
Intel                     e25b1fd8-c4ff-41ac-a6bc-22620296f01c   802-3-ethernet    Sun 21 Apr 2013 08:12:29 PM VET   

所有的连接都存储在/etc/NetworkManager/system-connections/文件夹中。
如果我现在查看那个文件夹,我会看到以下文件:
$ ls /etc/NetworkManager/system-connections
Intel  pepe  PrivateSys  Realtek  Virus

这只是在您希望手动编辑/删除/添加连接时使用。

第六部分:登录时自动连接

对于您希望自动登录到无线路由器的情况,以下是步骤:

  1. 打开 interface 文件:

    sudo nano /etc/network/interfaces
    
  2. 添加以下信息(假设您的接口名称为 wlan0):

    auto wlan0
    iface wlan0 inet static
    address 分配的 IP 地址
    netmask 255.255.255.0
    gateway 网关地址
    wireless-essid 您的无线网络名称
    wireless-key 无线网络密钥
    
  3. 保存文件并重新启动计算机。请注意,这将保存在一个纯文本文件中,可以从同一台计算机访问。

奖金:找到你的无线连接名称的图形用户界面风格

  1. 点击网络管理器,进入连接信息

    screenshot

  2. 转到包含您的无线网卡的选项卡

    screenshot

在这个图片中,这个网络卡的名称是eth1(括号内)。但对于每个用户来说,这可能是不同的。通常它会是一个wlan(比如wlan0、wlan1、wlan2...),但也可以是eth1、eth2等等。所以你需要看一下它的名字。

另一种快速找到名字的方法是输入iwconfig,它将显示所有可用的无线网络卡。


3如果找到了另一种命令行方式来查找无线接口的名称,在输入"iwlist"后按两次Tab键,终端将自动在"iwlist"后面输入接口的名称。 - Suhaib
2从答案的完整性来看,我可以准确猜测出作者是谁。 - jobin
1@douglaswalrath 你可以使用引号,就像是“糖果仙子”这样。 - Luis Alvarado
谢谢这份详尽的指南!我想知道是否有其他方法在启动时连接到无线网络而不必将密码明文写在文件中... 你有什么主意吗? - Michele
我可以想到一个脚本,只能由特定用户执行,并且它从只有特定用户能够读取的加密位置获取密码,然后将密码存储在临时环境变量中,作为输入发送给无线命令。连接成功后,临时环境变量将被删除。我只是在思考其他方法而已。 - Luis Alvarado
1@Michele 这个其他答案提供了如何防止密码保存在历史记录中的指导。http://askubuntu.com/a/279333/237654 - Hector Correa
我按照步骤操作,但是当我运行wpa_supplicant -iwlan0 -c/etc/wpa_supplicant.conf -Dwext -d时,出现了ioctl [SIOCSIWENCODEEXT] Invalid argument错误。 - PHP Learner
@PHPLearner 你确定已经验证了.conf文件的正确语法吗?通常,这个错误意味着.conf文件中有些地方写得不正确。 - Luis Alvarado
wpa_supplicant 的初始使用对我来说产生了一个错误——这不是配置文件的期望输出。 - Angelo
对于像我一样在Ubuntu 14.04中寻找create_connection脚本的人来说:它不再存在于checkbox软件包中,而是出现在plainbox-provider-checkbox软件包中的/usr/lib/2013.com.canonical.certification:checkbox/bin/create_connection路径下。 - ars
对于像我自己或者@PHPLearner这样遇到ioctl[SIOCSIWENCODEEXT]错误的人来说,我发现重新启动设备可以解决这个错误。一旦我重新启动,就能够连接到网络并获得一个分配的IP地址。 - The Thirsty Ape

如果你知道怎么做的话,这很容易。

显示可用的 WLAN 接入点:

nmcli dev wifi

连接到访问点:

nmcli dev wifi connect $ACCESS_POINT password $PASSWORD

3这比阿尔瓦拉多受赞同的答案要好得多,而那个答案在我的情况下不起作用(Linux Mint 17.1)。但这非常简单,确实有效! - Thorben
1在Linux Mint 17上对我起作用 - David Okwii
1这对我来说是获胜的答案。快速、简单和安全。谢谢! - GTRONICK
4@Thorben 在我看来,这不是一个被接受的答案,因为“网络管理器命令行界面”并没有回答原始问题“如何在没有网络管理器的情况下连接”。 - Vorac
2+1 因为这个回答虽然与问题无关,但对于处于恢复模式的人来说会有帮助,并且能节省时间。用户82110的工作非常出色。 - Luis Alvarado
在Mint Mate 18上完美运行! - Eric
同时也适用于Fedora 31! - Stefan Golubović
要先打开无线网络,请执行nmcli networking on。要关闭它,请执行nmcli networking off - Brōtsyorfuzthrāx
这个解决方案在没有安装X窗口的情况下能否工作?我没有尝试过,但它在运行在Xubuntu 22.04.1 LTS上的Cinnamon终端仿真器上是可行的。 - Brōtsyorfuzthrāx

wicd带有两个命令行工具:wicd-curses和wicd-cli(可能需要单独安装) wicd-curses允许您以交互方式配置/连接/断开网络(有线或无线),wicd-cli则通过命令行选项提供相同的功能(适用于脚本)。我在cron作业中使用它来解决一些自动重新连接的问题。
wicd-cli -y -c -m MY_NETWORK_SSID

此外,您还可以像这样“只是”拥有一个wpa_supplicant配置:
/etc/network/interface:
auto wlan0 
iface wlan0 inet dhcp 
wpa-conf /etc/wpa.conf

作为一个WPA的例子,/etc/wpa.conf文件中包含以下内容:
network={
  ssid="MY_NETWORK_SSID"
  proto=RSN
  key_mgmt=WPA_PSK
  pairwise=CCMP_TKIP
  group=CCMP_TKIP
  psk="my network key in the clear"
}

有很多考虑因素,其中之一是安全问题,即明文存储预共享密钥(wpa_supplicant可以让您提供加密或者只是混淆的密钥,请查看手册),同时将该文件设置为仅由root拥有和可读是一种缓解措施。
我认为拥有多个网络部分可以按优先顺序连接多个网络。

wicd默认情况下未安装,不确定它是否与网络管理器兼容。 - guntbert
不兼容。您可以按照https://help.ubuntu.com/community/WICD进行操作。 - tr33hous

我使用 wicd-curses,我发现它是迄今为止最简单的用户界面。

wicd-curses

你需要使用(右箭头键->)来设置配置;其他的都可以从屏幕上的指示中明显看出。
当然,你需要找到一种在没有wicd的情况下上网的方法;我假设你已经解决了这个问题,否则你就不会发帖了。 (这对于楼主来说已经不及时了,只是为了记录而发布,因为这个问题仍然在谷歌上出现。对于谷歌搜索者:如果你正在从咖啡馆、朋友的电脑或其他地方阅读这篇文章,也许你可以用一根线连接到某个地方,然后使用sudo apt-get install wicd-curses安装wicd-curses;然后确保在离开之前在一个已知可用的网络上进行测试!)

在Ubuntu 18.04+上解决方案,无需使用NetworkManager

在新安装的Ubuntu Server 20.04上使用RasPi进行工作:NetworkManager(nmcli / nmtui等)尚未安装,因此可能需要更多手动操作,至少在开始阶段是有帮助的。

从18.04版本开始,Ubuntu的底层网络似乎由netplan处理,因此需要为这些版本进行配置。一个有用的指南提供了答案;简而言之(例如),

确定您的无线接口的名称,

$ ip a

通常情况下,它是“wlan0” - 在“ip a”的输出中查找此信息。现在编辑“/etc/netplan/50-cloud-init.yaml”。
$ sudo vi /etc/netplan/50-cloud-init.yaml

(其他编辑可用等)并添加一个如下所示的wifis:部分,
network:
    ethernets:
        eth0:
            dhcp4: true
            optional: true
    version: 2
    wifis:
        wlan0:
            optional: true
            access-points:
                "network-name-here":
                    password: "wifi-password-here"
            dhcp4: true

启用此功能,

$ sudo netplan apply

最后检查一下你的wifi是否已经连接上了,可以通过查找接口和相应的IP地址来确认。
$ ip a

我按照编辑.yaml文件的步骤进行操作,我的情况下是“01-network-manager-all.yaml”。运行“sudo netplan apply”后,没有出现任何错误,但是运行“$ ip a”只显示了局域网配置,“wlo1”或类似的内容没有出现。我正在运行Ubuntu 20.04,目前在tty1上,因为在更改显示驱动程序后出现了问题,我不再拥有图形界面,需要通过互联网下载更新的驱动程序。 - Luce