从脚本更改WiFi WPA2密钥

时间:2014-03-06 05:31:09

标签: regex linux bash sed raspberry-pi

我正在使用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值&之后截断文件。

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

1 个答案:

答案 0 :(得分:0)

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

 sed "/^[[:space:]]*ssid=\"$SSID\"[[:space:]]*$/,/}/s/^\([[:space:]]*psk=\"\)[^\"]*/\1$PSK/" wpa.txt
但是,这是相当脆弱的。如果输入格式不正确,或者ssid位于块中的psk之后,它将会中断。正确的解决方案(在这种情况下严重过度杀伤)是为输入格式提供适当的解析器;虽然理论上可以在sed中进行,但如果你要使用像Python或Perl这样的高级语言,甚至是awk,这将更加简单。