Как разобрать фрагмент строки между двумя другими, используя "sed" или другие утилиты терминала linux? - PullRequest
1 голос
/ 01 июня 2019

Мне нужно проанализировать парольную фразу, используя ssid-подобный триггер из файла Android (data / misc / wifi / wpa_supplicant.conf) (нужен root), используя утилиты терминала Android, которые будут вызывать функцию java.Фрагмент файла выглядит следующим образом:

network={
    ssid="12345678"
    psk="87654321"
    key_mgmt=WPA-PSK

Мне нужно разобрать фразу psk.Я пытаюсь использовать это:

sed -n '/ssid=""+ssid+""psk"/,/"key_mgmt/p'

, но это не может работать, пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Использование первого примера файла из https://www.systutorials.com/docs/linux/man/5-wpa_supplicant.conf/:

$ cat file
# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=wheel
#
# home network; allow all valid ciphers
network={
        ssid="home"
        scan_ssid=1
        key_mgmt=WPA-PSK
        psk="very secret passphrase"
}
#
# work network; use EAP-TLS with WPA; allow only CCMP and TKIP ciphers
network={
        ssid="work"
        scan_ssid=1
        key_mgmt=WPA-EAP
        pairwise=CCMP TKIP
        group=CCMP TKIP
        eap=TLS
        identity="user [at] example.com"
        ca_cert="/etc/cert/ca.pem"
        client_cert="/etc/cert/user.pem"
        private_key="/etc/cert/user.prv"
        private_key_passwd="password"
}

Вот как найти тег с заданным значением и распечатать значение другого тега с помощью стандартного инструмента UNIX:

$ cat tst.awk
{ gsub(/^[[:space:]]+|[[:space:]]+$/,"") }
/^network[[:space:]]*=/ {
    inNw = 1
    next
}
inNw {
    if ( /^[[:alnum:]_]+[[:space:]]*=/ ) {
        tag = val = $0
        sub(/[[:space:]]*=.*/,"",tag)
        sub(/[^=]+=[[:space:]]*/,"",val)
        f[tag] = val
    }
    else if ( /^}/ ) {
        if ( ( f[fndTag] == fndVal ) ||
             ( f[fndTag] == "\"" fndVal "\"" ) ) {
            print f[prtTag]
        }
        delete f
        inNw = 0
    }
}

.

$ awk -v fndTag='ssid' -v fndVal='home' -v prtTag='psk' -f tst.awk file
"very secret passphrase"

$ awk -v fndTag='ssid' -v fndVal='work' -v prtTag='key_mgmt' -f tst.awk file
WPA-EAP

$ awk -v fndTag='key_mgmt' -v fndVal='WPA-EAP' -v prtTag='identity' -f tst.awk file
"user [at] example.com"

Вышеописанное будет работать при использовании любого awk в любой оболочке на любом компьютере UNIX.

1 голос
/ 01 июня 2019

Попробуйте следующее sed:

ssid=12345678
sed -n '/ssid="'$ssid'"/{N;s/.*psk="\([^"]*\).*/\1/p}'

Будет извлечено 87654321.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...