V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Oathbinder
V2EX  ›  Linux

用 systemd 实现可开启/关闭的脚本注入有没有什么好方法

  •  
  •   Oathbinder · 2019-06-03 06:14:01 +08:00 · 3421 次点击
    这是一个创建于 2004 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简单来说就是有两个 bash 脚本 A 和 B,A 会根据参数去修改 B 的一些内容,然后用 B 去替换一个可执行文件,当然也可以用 A 把被替换的文件换回来。需求是用 systemd 在启动时运行 A 外加几个参数,可能需要运行多次 A 来替换多个文件,并且能够查看当前替换了哪些文件

    用一个例子来说就是运行 A -arg "rf"后,A 把"rf"写入 B 相应位置,然后用 B 替换 /bin/rm,原来的 rm 变成 /bin/rm.real,B 会先判断传入参数然后再去执行原始命令,比如运行 rm -rf /时,B 发现参数中有-rf 就不去真的执行 /bin/rm.real -rf /而是直接 exit 1

    我现在的想法就是写两个 bash 脚本一个替换一个恢复然后写到 ExecStart 和 ExecStop 里,每个需要替换的文件就是一个服务通过 systemctl enable/disable scriptA@file1 开关注入

    #!/bin/bash
    /usr/bin/A replace arg1 arg2 file1
    
    #!/bin/bash
    /usr/bin/A revert file1
    

    这个方法的缺点就是每个需要替换的文件都要写这两个只有一行命令的脚本,看起来不是那么优雅。本来想通过一个配置文件记录所有要替换的文件和对应参数,但是这样的话一旦从配置文件中删除了一个替换记录那么脚本也就不知道哪些文件被替换了也就没办法恢复了。所以还有没有什么更优雅的方法来实现这个需求?

    14 条回复    2019-06-03 20:55:43 +08:00
    sagaxu
        1
    sagaxu  
       2019-06-03 07:11:52 +08:00 via Android
    还不如直接上容器
    des
        2
    des  
       2019-06-03 07:26:19 +08:00 via Android
    建议用容器
    jinliming2
        3
    jinliming2  
       2019-06-03 07:39:33 +08:00 via iPhone
    可否用环境变量文件,EnvironmentFile,指定一个环境变量文件,在脚本 A 中根据环境变量来操作 B。

    讲真,我没看太懂你的需求……
    des
        4
    des  
       2019-06-03 07:59:05 +08:00 via Android
    @jinliming2
    我猜题主是想这样:
    需要修改一些系统文件才能跑起来,但是跑起来之后需要把这些东西还原
    hanxiV2EX
        5
    hanxiV2EX  
       2019-06-03 08:09:59 +08:00 via Android
    用 alias 指向函数?
    VDimos
        6
    VDimos  
       2019-06-03 08:21:31 +08:00 via Android
    一个 echo,一个 xargs 不就行了吗,干嘛用脚本去改脚本的内容
    Oathbinder
        7
    Oathbinder  
    OP
       2019-06-03 08:31:31 +08:00
    @sagaxu 因为涉及到底层固件,所以要在系统启动早期注入,也就不能在容器里面跑
    @jinliming2 @des 不是修改文件才能跑起来,而是要把特点可执行文件替换掉,能够在特定条件下以特定值返回。
    @VDimos 因为要保持替换后调用参数不变,比如用 B 替换 rm 后,你还是能够执行 rm -rf /
    jinliming2
        8
    jinliming2  
       2019-06-03 08:37:30 +08:00 via iPhone
    那或者你可以参考 busybox 的做法,将 /bin 下的程序改为指向你 B 的软链接,然后在 B 中根据实际编程去调用真实的程序,这样所有逻辑就都在 B 中控制,也就不用再去替换了。
    伪代码:
    if xxx then
    exec rm.real $@
    else
    exec rm.fake $@
    endif
    Oathbinder
        9
    Oathbinder  
    OP
       2019-06-03 08:57:15 +08:00
    @jinliming2 这个功能已经通过 B 实现了,现在需要通过 systemd 来控制哪些程序需要被替换,要求是能够通过 systemd 来控制替换开启 /关闭
    jinliming2
        10
    jinliming2  
       2019-06-03 10:15:46 +08:00 via iPhone
    @Oathbinder 那可以在 B 里通过 socket file 与 A 通信查询,然后判断逻辑还在 B 里吗?
    因为 systemd 只是一个服务管理系统,不太好做控制器的吧?
    momocraft
        11
    momocraft  
       2019-06-03 10:18:40 +08:00
    感觉是 XY 问题
    Oathbinder
        12
    Oathbinder  
    OP
       2019-06-03 10:25:44 +08:00
    @jinliming2 我在想如何通过配置文件和 service 实现 systemctl enable/disable [email protected] 来控制是否替换可执行文件 file1
    ps1aniuge
        13
    ps1aniuge  
       2019-06-03 16:31:23 +08:00
    手机 rom 黑客的需求?夺权强插垃圾 rom ?
    Oathbinder
        14
    Oathbinder  
    OP
       2019-06-03 20:55:43 +08:00 via iPhone
    @ps1aniuge 内部测试需要
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3514 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:49 · PVG 12:49 · LAX 20:49 · JFK 23:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.