V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
chattrz
V2EX  ›  问与答

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

  •  
  •   chattrz · 2018-04-01 23:00:01 +08:00 · 2042 次点击
    这是一个创建于 2427 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    在此基础上,可以了解
    1. awk/sed/grep 等字符匹配工具
    2. crond 等定时器
    3. inotify api
    x86vk
        22
    x86vk  
       2018-04-02 15:43:16 +08:00 via Android
    用 c 可以啊,写几个 exec 嘛(
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1894 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:18 · PVG 00:18 · LAX 08:18 · JFK 11:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.