技术解析

用 systemd 实现可开启/关闭的脚本注入有没有什么好方法
0
2021-06-21 09:11:58
idczone

简单来说就是有两个 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 [email protected] 开关注入

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

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


还不如直接上容器

建议用容器

可否用环境变量文件,EnvironmentFile,指定一个环境变量文件,在脚本 A 中根据环境变量来操作 B。
讲真,我没看太懂你的需求……


我猜题主是想这样:
需要修改一些系统文件才能跑起来,但是跑起来之后需要把这些东西还原

用 alias 指向函数?

一个 echo,一个 xargs 不就行了吗,干嘛用脚本去改脚本的内容

因为涉及到底层固件,所以要在系统启动早期注入,也就不能在容器里面跑
不是修改文件才能跑起来,而是要把特点可执行文件替换掉,能够在特定条件下以特定值返回。
因为要保持替换后调用参数不变,比如用 B 替换 rm 后,你还是能够执行 rm -rf /

那或者你可以参考 busybox 的做法,将 /bin 下的程序改为指向你 B 的软链接,然后在 B 中根据实际编程去调用真实的程序,这样所有逻辑就都在 B 中控制,也就不用再去替换了。
伪代码:
if xxx then
exec rm.real [email&/>else
exec rm.fake [email&/>endif

这个功能已经通过 B 实现了,现在需要通过 systemd 来控制哪些程序需要被替换,要求是能够通过 systemd 来控制替换开启 /关闭

那可以在 B 里通过 socket file 与 A 通信查询,然后判断逻辑还在 B 里吗?
因为 systemd 只是一个服务管理系统,不太好做控制器的吧?

感觉是 XY 问题

我在想如何通过配置文件和 service 实现 systemctl enable/disable [email&来控制是否替换可执行文件 file1

手机 rom 黑客的需求?夺权强插垃圾 rom ?

内部测试需要

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服