shell编程文本处理求助

发布于 2021-11-24 00:50:25 字数 2836 浏览 838 评论 1

小弟最近搞无线,碰到一个脚本问题,需要把自定义的一个无线配置文件转换成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  errorn");
        if(fp_in) fclose(fp_in);
        if(fp_out) fclose(fp_out);
        return -1;
    }
    fprintf(fp_out, "update_config=1nctrl_interface=/var/run/wpa_supplicantnap_scan=1nn");
    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={ntssid="%s"ntscan_ssid=1ntkey_mgmt=NONEn}nn", conf.essid);
        } else if(strcasestr(conf.enc, "WPA")){
            /* WPA or WPA2 */
            fprintf(fp_out, "network={ntssid="%s"ntscan_ssid=1ntkey_mgmt=WPA-PSK WPA-EAP IEEE8021Xntauth_alg=OPEN SHAREDntpairwise=TKIP CCMPntpsk="%s"n}nn", conf.essid, conf.passwd);
        } else if(strcasestr(conf.enc, "WEP")){
            /* WEP */
            fprintf(fp_out, "network={ntssid="%s"ntscan_ssid=1ntkey_mgmt=NONEntauth_alg=OPEN SHAREDntwep_key0="%s"n}nn", conf.essid, conf.passwd);
        }   
    }   
    if(fp_in) fclose(fp_in);
    if(fp_out) fclose(fp_out);
    return 0;
}



如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱的那么颓废 2021-11-24 16:59:59

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文