2014-03-06 41 views
0

我正在使用Raspbian Wheezy,但這不是Raspberry Pi的特定問題。從腳本更改WiFi WPA2密鑰

我正在開發一個C應用程序,它允許用戶更改他們的WiFi密碼。

我沒有找到一個準備好的腳本/命令爲此,所以我試圖使用sed

我將SSID名稱和新密鑰傳遞給bash腳本,並將密鑰替換爲* etc/wpa_supplicant/wpa_supplicant.conf。*中的該ssid塊。

我的應用程序以根用戶身份運行。

下面顯示了一個示例塊。

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值&此後截斷該文件。

所以我需要幫助來糾正上面的代碼,或嘗試不同的解決方案。

+0

我猜你的代碼可能仍然有效,但爲了正確起見,將'sed -n「1!H; 1 h; $ ...'改爲'sed -n」1!H; 1 h; \ $ ...' – anishsane

+0

'sed'在這裏存在問題,因爲您基本上不允許使用您用作正則表達式分隔符的任何字符。有辦法解決這個問題,但也許你應該考慮切換到代碼和數據不混合的工具? – tripleee

+0

請幫忙。我正在尋找一種通過腳本更改WiFi WPA2 Passkey的方法。沒有人試過這個嗎? –

回答

0

如果我們可以假設該領域始終處於嚴格的秩序,其中ssid=psk=之前,你真正需要的是

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

這是相當脆弱,雖然。如果輸入格式不正確,或者ssid在塊中的psk之後,它將會中斷。正確的解決方案(但在這種情況下嚴重矯枉過正)是爲輸入格式提供合適的解析器;雖然在sed中這在理論上是可行的,但如果您要開發像Python或Perl這樣的高級語言,或者甚至是Awk,將會更加簡單。

+0

謝謝三合一,我得到以下錯誤:./chPSK。sh:第18行:意外的EOF,同時尋找匹配的'「' ./chPSK.sh:第19行:語法錯誤:文件意外結束 其中,chPSK.sh是我的腳本文件,並且您的sed代碼位於第18行。 –

+0

好的,我糾正了你的代碼,[^「]應該是[^ \」]。此外,你在最後的時候忘記了大括號(實際上,這裏不需要大括號)... ;-)現在有用。 。讓我測試一下...... **謝謝**讓我走向正確的方向:-)。也許你應該編輯我的代碼,將其標記爲答案? –

+0

謝謝,我被打斷了,沒有時間去測試。 : -/ – tripleee