我正在使用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
我用过hold&模式缓冲区,因为模式可以跨越多行。
上面,第一个例子似乎忽略了范围&替换第一个实例,然后截断文件的其余部分。
第二个例子替换了最后找到的psk值&之后截断文件。
所以我需要帮助纠正上面的代码,或尝试不同的解决方案。
答案 0 :(得分:0)
如果我们可以假设字段总是按ssid=
psk=
之前的严格顺序排列,那么您真正需要的是
sed "/^[[:space:]]*ssid=\"$SSID\"[[:space:]]*$/,/}/s/^\([[:space:]]*psk=\"\)[^\"]*/\1$PSK/" wpa.txt
但是,这是相当脆弱的。如果输入格式不正确,或者ssid
位于块中的psk
之后,它将会中断。正确的解决方案(在这种情况下严重过度杀伤)是为输入格式提供适当的解析器;虽然理论上可以在sed
中进行,但如果你要使用像Python或Perl这样的高级语言,甚至是awk,这将更加简单。