Change WiFi WPA2 passkey from a script

2019-08-31 01:32发布

I'm using Raspbian Wheezy, but this is not a Raspberry Pi specific question.

I am developing a C application, which allows the user to change their WiFi Password.

I did not find a ready script/command for this, so I'm trying to use sed.

I pass the SSID name and new key to a bash script, and the key is replaced for the that ssid block within *etc/wpa_supplicant/wpa_supplicant.conf.*.

My application runs as root.

A sample block is shown below.

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

so far I've tried the following (I've copied the wpa_supplicant.conf to wpa.txt for trying) :

(1) This tries to do the replacement between a range, started when my SSID is detected, and ending when the closing brace, followed by a newline.

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

and

(2) This tries to 'remember' the matched pattern, and reproduce it in the output, but with the new key.

SSID="TRIMURTI"
PSK="12345678"

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

I have used hold & pattern buffers as the pattern can span multiple lines.

Above, the first example seems to ignore the range & replaces the 1st instance, and then truncates the rest of the file.

The second example replaces the last found psk value & truncates the file thereafter.

So I need help in correcting the above code, or trying a different solution.

1条回答
男人必须洒脱
2楼-- · 2019-08-31 02:01

If we can assume the fields will always be in a strict order where the ssid= goes before psk=, all you really need is

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

This is fairly brittle, though. If the input is malformed, or if the ssid goes after the psk in your block, it will break. The proper solution (which however is severe overkill in this case) is to have a proper parser for the input format; while that is in theory possible in sed, it would be much simpler if you were to swtich a higher-level language like Python or Perl, or even Awk.

查看更多
登录 后发表回答