用 systemd 实现可开启/关闭的脚本注入有没有什么好方法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Oathbinder
V2EX    Linux

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

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

    简单来说就是有两个 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     Solana     878 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 215ms UTC 22:32 PVG 06:32 LAX 15:32 JFK 18:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86