【问题标题】:Change WiFi WPA2 passkey from a script从脚本更改 WiFi WPA2 密码
【发布时间】:2014-03-06 05:31:09
【问题描述】:

我正在使用 Raspbian Wheezy,但这不是 Raspberry Pi 特定的问题。

我正在开发一个 C 应用程序,它允许用户更改他们的 WiFi 密码。

我没有为此找到现成的脚本/命令,所以我正在尝试使用 sed

我将 SSID 名称和新密钥传递给 bash 脚本,密钥被替换为 *etc/wpa_supplicant/wpa_supplicant.conf.* 中的那个 ssid 块。

我的应用程序以 root 身份运行。

一个示例块如下所示。

    network={
        ssid="MY_SSID"
        scan_ssid=1
        psk="my_ssid_psk"
}

到目前为止,我已经尝试了以下方法(我已将 wpa_supplicant.conf 复制到 wpa.txt 进行尝试):

(1) 这会尝试在一个范围之间进行替换,从检测到我的 SSID 时开始,到右大括号后跟换行符结束。

SSID="TRIMURTI"
PSK="12345678"

sed -n "1 !H;1 h;$ {x;/ssid=\"${SSID}\"/,/}\n/ s/[[:space:]]*psk=.*\n/\n   psk=\"${PSK}\"\n/p;}" wpa.txt

(2) 这会尝试“记住”匹配的模式,并在输出中重现它,但使用新密钥。

SSID="TRIMURTI"
PSK="12345678"

sed -n "1 !H; 1 h;$ {x;s/\(ssid=\"${SSID}\".*psk=\).*\n/\1\"${PSK}\"/p;}" wpa.txt   

我使用了保持和模式缓冲区,因为模式可以跨越多行。

上面,第一个示例似乎忽略了范围并替换了第一个实例,然后截断了文件的其余部分。

第二个示例替换最后找到的 psk 值并随后截断文件。

所以我需要帮助来纠正上述代码,或者尝试不同的解决方案。

【问题讨论】:

  • 我猜您的代码可能仍然有效,但为了正确起见,请将 sed -n "1 !H; 1 h;$... 更改为 sed -n "1 !H; 1 h;\$...
  • sed 在这里有问题,因为您基本上不允许使用任何字符作为正则表达式分隔符。有一些方法可以解决这个问题,但也许您应该考虑切换到代码和数据不混合的工具?
  • 请帮忙。我正在寻找一种通过脚本更改 WiFi WPA2 密码的方法。没人试过吗?

标签: regex linux bash sed raspberry-pi


【解决方案1】:

如果我们可以假设这些字段将始终严格按照ssid=psk= 之前的顺序排列,那么您真正需要的是

 sed "/^[[:space:]]*ssid=\"$SSID\"[[:space:]]*$/,/}/s/^\([[:space:]]*psk=\"\)[^\"]*/\1$PSK/" wpa.txt

不过,这相当脆弱。如果输入格式错误,或者如果 ssid 在您的块中出现在 psk 之后,它将中断。正确的解决方案(但是在这种情况下是严重的过度杀伤)是为输入格式提供适当的解析器;虽然这在 sed 中理论上是可能的,但如果您要切换更高级的语言,例如 Python 或 Perl,甚至是 Awk,它会简单得多。

【讨论】:

  • 谢谢你,triple,我收到以下错误:./chPSK.sh:第 18 行:寻找匹配的 `"' 时出现意外 EOF ./chPSK.sh:第 19 行:语法错误:意外end of file 其中,chPSK.sh 是我的脚本文件,你的 sed 代码在第 18 行。
  • 好的,我更正了您的代码。 [^"] 应该是 [^\"] 。另外,你忘记了最后一个 " 之前的右大括号。(实际上,这里不需要大括号)...... ;-)现在它可以工作了。让我测试一下有点...谢谢让我走在正确的方向:-)。也许你应该编辑你的代码让我把它标记为答案?
  • 谢谢,我被打断了,没有时间测试。 :-/
  • 请注意...您需要在最后一个 " 之前添加右大括号。谢谢您的帮助!
  • 或者去掉杂散的开口支架。现在更新了。感谢您的坚持(-:
【解决方案2】:

最有用的情况是更新密码或配置中的其他值是利用 wpa_cli。例如:

wpa_cli -i "wlan0" set_network "0" psk "\"Some5Strong1Pass"\"
wpa_cli -i "wlan0" save_config

更新cfg文件需要save_config方法:/etc/wpa_supplicant/wpa_supplicant.conf

【讨论】:

    猜你喜欢
    • 2012-06-29
    • 2018-03-31
    • 2021-02-12
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多