chattrz
V2EX  ›  问与答

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

  •  
  •   chattrz · Apr 1, 2018 · 2929 views
    This topic created in 3147 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
    MeteorCat
    Apr 1, 2018 via Android
    1
    cat /etc/resolv.conf| nameserver 8.8.8.8
    MeteorCat
    MeteorCat
    Apr 1, 2018 via Android
    2
    上面错了,应该是 cat /etc/resolv.conf | grep nameserver 8.8.8.8
    MeteorCat
    MeteorCat
    Apr 1, 2018 via Android❤️1
    3
    或者这样 新建 /data/history/文件夹,之后 cp /etc/reolv.conf 到目录里面之后调用系统 diff 命令
    chattrz
    chattrz
    OP
    Apr 1, 2018
    4
    用 C 语言能完成吗
    chattrz
    chattrz
    OP
    Apr 1, 2018
    5
    @MeteorCat 用 C 语言能完成吗
    aheadlead
    aheadlead
    Apr 1, 2018❤️1
    6
    用 shell 够了
    line='nameserver 8.8.8.8'; path='/etc/resolv.conf'; grep -q "${line}" "${path}" || echo "${line}" >> ${path};

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

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