【发布时间】: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