V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
chattrz
V2EX  ›  问与答

[求助] Linux C 语言检查文件内容是否包含关键字

  •  
  •   chattrz · Apr 1, 2018 · 2490 views
    This topic created in 2947 days ago, the information mentioned may be changed or developed.

    想写一个检查 /etc/resolv.conf 文件内容的监控,15 秒检查一次文件内容是否包含 nameserver 8.8.8.8 如果不包含,自动写入 萌新一个,别喷我

    22 replies    2018-04-02 15:43:16 +08:00
    MeteorCat
        1
    MeteorCat  
       Apr 1, 2018 via Android
    cat /etc/resolv.conf| nameserver 8.8.8.8
    MeteorCat
        2
    MeteorCat  
       Apr 1, 2018 via Android
    上面错了,应该是 cat /etc/resolv.conf | grep nameserver 8.8.8.8
    MeteorCat
        3
    MeteorCat  
       Apr 1, 2018 via Android   ❤️ 1
    或者这样 新建 /data/history/文件夹,之后 cp /etc/reolv.conf 到目录里面之后调用系统 diff 命令
    chattrz
        4
    chattrz  
    OP
       Apr 1, 2018
    用 C 语言能完成吗
    chattrz
        5
    chattrz  
    OP
       Apr 1, 2018
    @MeteorCat 用 C 语言能完成吗
    aheadlead
        6
    aheadlead  
       Apr 1, 2018   ❤️ 1
    用 shell 够了
    line='nameserver 8.8.8.8'; path='/etc/resolv.conf'; grep -q "${line}" "${path}" || echo "${line}" >> ${path};

    然后你搜一下 cron 配置每 15 秒执行一下这句话
    chattrz
        7
    chattrz  
    OP
       Apr 1, 2018
    @aheadlead 大佬能用 C 语言完成吗
    aheadlead
        8
    aheadlead  
       Apr 1, 2018
    @chattrz 你这是何必呢…
    chattrz
        9
    chattrz  
    OP
       Apr 1, 2018
    @aheadlead 先谢为敬:D
    MeteorCat
        10
    MeteorCat  
       Apr 2, 2018 via Android
    可以,你保存个原始 resolv.conf 文件,用 C 的文件读取 /etc/resolv.conf 直接对比每个字符串,不符合就将原始配置写入
    WordTian
        11
    WordTian  
       Apr 2, 2018 via Android
    用 C 的话应该可以循环按行读文本,搜索 8.8.8.8。
    要是不存在,就在最后追加上 nameserver 8.8.8.8
    katsusan
        12
    katsusan  
       Apr 2, 2018 via iPhone
    按行读取,调用 strstr 函数找子串,
    if (strstr(line,NAMESERVER) = NULL) //null
    代表没找到
    kokutou
        13
    kokutou  
       Apr 2, 2018 via Android
    用 c 要考虑的边界太多了。。。
    johnniang
        14
    johnniang  
       Apr 2, 2018 via Android
    用 shell 的某些命令也只是别人用 C 实现好了的,并不觉得有什么高大上。
    iwtbauh
        15
    iwtbauh  
       Apr 2, 2018 via Android
    @johnniang
    1. 避免重复发明轮子。
    2. 利用基本(简单)工具,让他们一起工作,从而完成复杂的任务,避免开发复杂的专门程序,这正是 Unix 哲学。
    3. 一行 Shell 脚本胜过万行 C 代码。
    iwtbauh
        16
    iwtbauh  
       Apr 2, 2018 via Android   ❤️ 2
    每 15 秒一次不好,太浪费系统资源
    fcntl F_NOTIFY (旧内核用这个)和 inotify (新内核用这个)了解一下
    johnniang
        17
    johnniang  
       Apr 2, 2018 via Android
    @iwtbauh 别人是以学习的目的来完成这个功能,而不是依靠工具一步到位。
    pkookp8
        18
    pkookp8  
       Apr 2, 2018 via Android
    @MeteorCat grep 后不要跟两个参数,第二个参数会被识别为文件名。或者加引号
    ironx
        19
    ironx  
       Apr 2, 2018 via Android
    可以用 c 做个接口。调用 shell 脚本。或者直接检查内核的数据结构。
    mN71eOOprFyMsnPx
        20
    mN71eOOprFyMsnPx  
       Apr 2, 2018
    @iwtbauh +1
    用 inotify 才是正解。
    qakito
        21
    qakito  
       Apr 2, 2018
    如果只是以学习语言为目标的话,需要了解:
    1. 文件操作
    2. 内容匹配
    3. 定时器

    在此基础上,可以了解
    1. awk/sed/grep 等字符匹配工具
    2. crond 等定时器
    3. inotify api
    x86vk
        22
    x86vk  
       Apr 2, 2018 via Android
    用 c 可以啊,写几个 exec 嘛(
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3552 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 77ms · UTC 11:05 · PVG 19:05 · LAX 04:05 · JFK 07:05
    ♥ Do have faith in what you're doing.