如何连接到特定的BSSID?

有多个具有相同SSID的无线网络可用。 我正在寻找一种连接到特定网络(通过BSSID)的解决方案。

nmcli con up ifname ap 看起来不错,但不幸的是它不起作用。它只会重新连接到原始网络。

5个回答

你可以使用Network Manager的命令行界面nmcli。
我相信你已经有了BSSID。你可以使用以下命令来检查和验证它: ($是命令提示符。命令后面的行是输出结果。)
$ nmcli -f in-use,ssid,bssid,signal,bars  dev wifi
*  SSID               BSSID              SIGNAL  BARS 
*  Apollo III (TWC)   XX:XX:XX:XX:XX:XX  98      ▂▄▆█ 
   Chromecast8481     XX:XX:XX:XX:XX:XX  97      ▂▄▆█ 
   --                 XX:XX:XX:XX:XX:XX  94      ▂▄▆█ 
   Apollo III (1)     XX:XX:XX:XX:XX:XX  87      ▂▄▆█ 
   TWCWiFi            XX:XX:XX:XX:XX:XX  80      ▂▄▆_ 
   CableWiFi          XX:XX:XX:XX:XX:XX  80      ▂▄▆_ 
   TWCWiFi-Passpoint  XX:XX:XX:XX:XX:XX  80      ▂▄▆_ 
   Apollo III (1)     XX:XX:XX:XX:XX:XX  70      ▂▄▆_

连接到BSSID的CLI为:
$ nmcli d wifi connect XX:XX:XX:XX:XX:XX

那个命令会为你提供一个图形界面提示输入密码。你也可以在命令行中输入密码(可能存在安全问题)。
$ nmcli d wifi connect XX:XX:XX:XX:XX:XX password "mypassword"

后者不会提示输入密码,而是通过命令中的BSSID连接到指定的网络。如果您之前已经连接到另一个网络,它将被命令中指定的网络替换。
该命令还会将连接信息添加到`/etc/NetworkManager/system-connections`位置。该位置受保护。
可以通过通知区域中创建的名称,在网络图标上进行后续连接。

1为什么我要提供密码?我正在尝试连接的BSSID已经连接上了,但它仍然要求输入密码。难道我不能告诉它使用已经保存好的密码吗? - Michael
1为什么nmcli只显示2.4Ghz的连接?我来到这个页面的原因就是想强制我的电脑连接到5Ghz的mesh网络! - Gabriel Staples
2这个答案可能已经过时,或者从来没有按照预期的方式工作。如果连接已知于您的设备,指定BSSID似乎只是连接到整个SSID,而不是确切的BSSID。请参阅问题https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/465。 - sazerac

这个方法很简单,只需使用Network Manager提供的图形用户界面。

在顶部面板中找到网络图标,选择“编辑连接”,找到所需SSID的无线连接配置文件,打开进行编辑,然后进入BSSID字段,要么弹出所需的BSSID,要么手动输入所需的BSSID。

下面是一个示例无线连接,显示了其BSSID字段。

enter image description here


这个答案最初由MariusMatutiae在SuperUser上发布。如果这对你有帮助,请考虑在那里投票。

You can do it by connecting to the AP manually.

First, it is easiest to turn off network manager, if you are running one:

  sudo service network-manager stop

Then you need to identify the BSSID of the AP you wish to join: the command

 sudo iw dev wlan0 scan

(if you are using wlan0 as your wireless interface) will produce a lot of output, among which you will find something like:

  BSS f8:1a:67:aa:7f:b9 (on wlan0) -- associated
    TSF: 629432841083 usec (7d, 06:50:32)
    freq: 2417
    beacon interval: 100
    capability: ESS Privacy ShortPreamble SpectrumMgmt ShortSlotTime (0x0531)
    signal: -70.00 dBm
    last seen: 0 ms ago
    Information elements from Probe Response frame:
    SSID: MySSID_NAME

(the output is longer than this). The relevant part is of course BSS f8:1a:67:aa:7f:b9.

Next, you will have to free your interface of any previous IP addresses, just in case:

  sudo ip link set wlan0 down
  sudo ip addr flush dev wlan0
  sudo ip link set wlan0 up

Now you specify you want to connect to the specific AP:

  sudo iwconfig wlan0 essid MySSID_NAME ap f8:1a:67:aa:7f:b9

where of course ap precedes the BSSID you just identified. Now you need to start wpa_supplicant,

 sudo wpa_supplicant -Dnl80211 -i wlan0 -B -c FILE_with_WPA_Secrets

(if you do not know how to set up the file with your WPA credentials, you may look it up here for instance; just be careful, where it says network= {, it should be network={ without a space). Lastly,

 sudo dhclient -v wlan0

(the -v flag does not work on all Linux distros, I like it because I can monitor what is happening).

EDIT

The instructions above work for a network with WPA security. Fore WEP security, replace the wpa_supplicant command with:

  sudo iwconfig wlan0 key s:Your_WEP_password

Remember that the two characters s: before your password are necessary. After this, once again

  sudo dhclient -v wlan0
希望这能帮到你。

ap f8:1a:67:aa:7f:b9对我来说无法工作,我需要多次重新运行这些步骤,因为它会连接到随机的BSSID。我使用"sudo iw dev wlan0 scan |& grep -P '(^BSS.*associated$)' -A 10 | grep -E 'associated|SSID'"来检查关联的BSSID(如果没有输出,则运行几次)。 - 林果皞
你应该提供一个指向原始答案的链接,这样我们才能点赞。我在SuperUser上找不到它。 - Dan
@Dan,我已经更新了我的回答,并附上了参考帖子的链接。 - TheOdd

这更像是对TheOdd的回答的扩展。由于在许多发行版中iwconfig已被弃用,可以使用iw来与特定的接入点关联。iw与iwconfig稍有不同,您需要通过频率而不是BSSID指定特定的接入点。此外,我发现在从不同的接入点请求另一个DHCP租约之前,有必要释放先前的租约。假设您已经连接到同一网络上的一个接入点,您无需重新提交wpa_supplicant的身份验证。我正在使用wlan0,但您的无线网卡可能有不同的名称。以下是在具有相同ESSID的接入点之间切换的完整过程:
显示连接信息: iw wlan0 link 将wlan0断开连接: sudo ip link set wlan0 down 清除WNIC上任何先前的IP地址: sudo ip addr flush dev wlan0 删除旧的DHCP租约: sudo dhclient -r wlan0 将WNIC重新启动: sudo ip link set wlan0 up 扫描,记录频率: sudo iw dev wlan0 scan 使用iw(而不是iwconfig)指定ESSID和频率与特定的接入点进行关联:
sudo iw wlan0 connect 例如:
sudo iw wlan connect fly-for-wifi 2462
运行dhcp:
sudo dhclient -v wlan0
检查:
iw wlan0 link

这个答案相当于解释如何使用NetworkManager的图形界面,但是使用命令行界面。
(可选,用于列出所有可用的Wi-Fi及其BSSID)
nmcli设备wifi列表

编辑BSSID字段:
nmcli连接编辑连接名称
设置802-11-wireless.bssid 12:34:56:AB:CD:EF
保存
退出
或者:
nmcli连接修改连接名称 802-11-wireless.bssid 12:34:56:AB:CD:EF
其中连接名称通常与ESSID相同(如果是自动创建的,可以使用nmcli连接列出所有存储的连接名称), 将12:34:56:AB:CD:EF替换为连接ID。
使用连接配置文件:
nmcli连接启动连接名称

请注意,当该BSSID不可用时,它将不会自动连接到任何其他BSSID。
有一些可能的修复方法。
  • 手动恢复更改。

    做同样的事情,但在第2步中需要执行以下操作:

    nmcli connection edit ConnectionName
    remove 802-11-wireless.bssid
    save
    quit
    

    或者

    nmcli connection modify ConnectionName 802-11-wireless.bssid ''
    
  • 创建一个新的连接,克隆现有的连接。

    nmcli connection delete ConnectionName-cloned  # 删除所有名为“ConnectionName-cloned”的现有连接
    nmcli connection clone ConnectionName ConnectionName-cloned  # 创建一个名为“ConnectionName-cloned”的新连接,从名为“ConnectionName”的连接复制。请注意,如果已存在一个连接,它将创建一个同名的新连接
    nmcli connection modify ConnectionName-cloned 802-11-wireless.bssid 12:34:56:AB:CD:EF  # 如上所述
    nmcli connection up ConnectionName-cloned  # 如上所述