shell编程文本处理求助

Nocodo 发布于 2014/03/10 13:10
阅读 222
收藏 0

小弟最近搞无线,碰到一个脚本问题,需要把自定义的一个无线配置文件转换成wpa_supplicant需要的配置文件,苦于本人不熟悉shell编程,百般尝试都没有成功,特来oschina求助各位大神。

自定义的配置文件格式如下:

ESSID1    PASSWD1    TYPE1
ESSID2    PASSWD2    TYPE2
......

每行记录一个无线网络,每个记录分3个字段,用空格(或tab)分隔,这3个字段为

ESSID     :无线网络名
PASSWD :密码,如无密码,则为(NoPasswd), 含括号
TYPE      :机密类型,5种,OPEN、WEP、WPA、WPA2、WPA/WPA2


转化后的文件格式为:

如果TYPE是WPA/WPA2
network={
        ssid="SSID1"
        scan_ssid=1
        key_mgmt=WPA-PSK WPA-EAP IEEE8021X
        auth_alg=OPEN SHARED
        pairwise=TKIP CCMP
        psk="PASSWORD1"
}
如果TYPE是WEP
network={
    ssid="SSID1"
    scan_ssid=1
    key_mgmt=NONE
    auth_alg=OPEN SHARED
    wep_key0="PASSWORD1"
}
如果TYPE是OPEN或密码是(NoPasswd)
network={
    ssid="SSID1"
    scan_ssid=1
    key_mgmt=NONE
}

如上,不同的TYPE对应的生成结果不一样,原配置文件可能有多条记录,相应的生成多个network配置块,结果保存在名为wpa_supplicant.conf的文本文件中


附上本人用c语言写的代码供参考,求bash shell的实现方法

int create_wpasupp_conf(void)
{
    struct netconf_t {
        char essid[48];
        char passwd[48];
        char enc[16];
    };
    FILE *fp_in = fopen(GLOBAL_NETCONF_FILE, "r");
    FILE *fp_out = fopen(GLOBAL_WPASUPP_FILE, "w");
    if(fp_in == NULL || fp_out == NULL){
        printf("fopen  error\n");
        if(fp_in) fclose(fp_in);
        if(fp_out) fclose(fp_out);
        return -1;
    }
    fprintf(fp_out, "update_config=1\nctrl_interface=/var/run/wpa_supplicant\nap_scan=1\n\n");
    while(1){
        char buf[1024] = {0};
        struct netconf_t conf;
        memset(&conf, 0, sizeof(conf));
        if(fgets(buf, sizeof(buf)-1, fp_in) == NULL)
            break;
        if(sscanf(buf, "%s %s %s", conf.essid, conf.passwd, conf.enc) != 3)
            continue;
        if(!strcmp(conf.passwd, "(NoPasswd)") || strcasestr(conf.enc, "OPEN")){
            /* if no passwd, force enc=OPEN */
            fprintf(fp_out, "network={\n\tssid=\"%s\"\n\tscan_ssid=1\n\tkey_mgmt=NONE\n}\n\n", conf.essid);
        } else if(strcasestr(conf.enc, "WPA")){
            /* WPA or WPA2 */
            fprintf(fp_out, "network={\n\tssid=\"%s\"\n\tscan_ssid=1\n\tkey_mgmt=WPA-PSK WPA-EAP IEEE8021X\n\tauth_alg=OPEN SHARED\n\tpairwise=TKIP CCMP\n\tpsk=\"%s\"\n}\n\n", conf.essid, conf.passwd);
        } else if(strcasestr(conf.enc, "WEP")){
            /* WEP */
            fprintf(fp_out, "network={\n\tssid=\"%s\"\n\tscan_ssid=1\n\tkey_mgmt=NONE\n\tauth_alg=OPEN SHARED\n\twep_key0=\"%s\"\n}\n\n", conf.essid, conf.passwd);
        }   
    }   
    if(fp_in) fclose(fp_in);
    if(fp_out) fclose(fp_out);
    return 0;
}



加载中
0
N
Nocodo

额,在百度知道上的问题有答案了,附个连接

http://zhidao.baidu.com/question/1667647570039799427.html?quesup2&oldq=1

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部