如何编写脚本在启动时从 USB 驱动器读取 wifi SSID 和密码并自动登录到 wifi 网络

如何编写脚本在启动时从 USB 驱动器读取 wifi SSID 和密码并自动登录到 wifi 网络

我有一个运行 Debian 的嵌入式系统。我希望能够通过 USB 拇指驱动器提供 wifi 网络 SSID 和密码信息。这样我就可以轻松地将其部署到任何 wifi 网络。

是否可以在启动时让脚本从 USB 驱动器读取 wifi SSID 和密码并自动连接到 wifi 网络?有人有一个脚本可以做到这一点吗?

有更好的方法来实现这一点吗?

答案1

这里有一个使用 Perl 为您执行脚本的想法。您可以将其翻译成您选择的语言,甚至可能是 bash。真正重要的是连接到无线的命令。 Perl 只是我快速完成此操作的一种手段,您对快速的想法可能有所不同。如果您不习惯阅读 Perl,请注意,所有反引号都是 shell 命令。

例如,Gnome 内置了记住网络的处理功能,并且将为登录用户执行此操作,但是......我假设是无头设置。这很有趣,一个会自动连接到 Wi-Fi 的移动无头设置。凉爽的。

这假设有一个 wpa 网络,并且安装了 iwconfig(我敢打赌它与您的无线软件包一起提供)和 wpa_supplicant。

这仅说明 csv 中定义的一个网络。并假设它会在第一次尝试时起作用。您需要使用所需网络的实际参数来充实它,或者添加其他处理。但是,这个一般结构会很快为您完成。

文件@/mnt/usb/network.csv格式为“目标SSID,密码”:

myWifiSSID,mypassword

文件@ /home/me/connect.pl(例如chmod 755):

#!/usr/bin/perl
# Set to your device name.
$iface = "wlan0";

# Set to your USB mount point & network definition CSV file.
$networkdefinition = "/mnt/usb/network.csv";

# Get the contents of your file on USB stick.
$line = `cat $networkdefinition`;

# Read the CSV into parts.
@parts = split(/,/,$line);

# Get a list of wireless networks in range.
# And grep that for the network we're looking for.
$foundnetworks = `iwlist $iface scan | grep 'ESSID:"$parts[0]"'`;

# See if this turns up the network we're looking for
if (length($foundnetworks)) {
        # It did. Let's bring up that interface.                    
        `wpa_supplicant -B -i $iface -c <(wpa_passphrase $parts[0] $parts[1])`;
} else { 
        # Network not in range, perform error handling etc.
}

在你的 crontab 中:

@reboot /home/me/connect.pl

注意事项:

  • 需要更好的错误处理/更定期运行的方式
  • 需要处理 WPA 以外的其他网络
  • Cron 解决方案假设安装届时将可用。

这是在您进行过程中扩展的有趣内容,但是,这可能是一种使用 USB 记忆棒 CSV 文件来指定您的 WiFi 网络的快速启动方法。

真正的核心是这两个命令:

  • iwconfig
  • wpa_supplicant

剩下的只是关于如何实现您提出的自动连接到 WiFi AP 的解决方案的想法。

相关内容