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

2019-06-03 06:14:01 +08:00
 Oathbinder

简单来说就是有两个 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

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

3252 次点击
所在节点    Linux
14 条回复
sagaxu
2019-06-03 07:11:52 +08:00
还不如直接上容器
des
2019-06-03 07:26:19 +08:00
建议用容器
jinliming2
2019-06-03 07:39:33 +08:00
可否用环境变量文件,EnvironmentFile,指定一个环境变量文件,在脚本 A 中根据环境变量来操作 B。

讲真,我没看太懂你的需求……
des
2019-06-03 07:59:05 +08:00
@jinliming2
我猜题主是想这样:
需要修改一些系统文件才能跑起来,但是跑起来之后需要把这些东西还原
hanxiV2EX
2019-06-03 08:09:59 +08:00
用 alias 指向函数?
VDimos
2019-06-03 08:21:31 +08:00
一个 echo,一个 xargs 不就行了吗,干嘛用脚本去改脚本的内容
Oathbinder
2019-06-03 08:31:31 +08:00
@sagaxu 因为涉及到底层固件,所以要在系统启动早期注入,也就不能在容器里面跑
@jinliming2 @des 不是修改文件才能跑起来,而是要把特点可执行文件替换掉,能够在特定条件下以特定值返回。
@VDimos 因为要保持替换后调用参数不变,比如用 B 替换 rm 后,你还是能够执行 rm -rf /
jinliming2
2019-06-03 08:37:30 +08:00
那或者你可以参考 busybox 的做法,将 /bin 下的程序改为指向你 B 的软链接,然后在 B 中根据实际编程去调用真实的程序,这样所有逻辑就都在 B 中控制,也就不用再去替换了。
伪代码:
if xxx then
exec rm.real $@
else
exec rm.fake $@
endif
Oathbinder
2019-06-03 08:57:15 +08:00
@jinliming2 这个功能已经通过 B 实现了,现在需要通过 systemd 来控制哪些程序需要被替换,要求是能够通过 systemd 来控制替换开启 /关闭
jinliming2
2019-06-03 10:15:46 +08:00
@Oathbinder 那可以在 B 里通过 socket file 与 A 通信查询,然后判断逻辑还在 B 里吗?
因为 systemd 只是一个服务管理系统,不太好做控制器的吧?
momocraft
2019-06-03 10:18:40 +08:00
感觉是 XY 问题
Oathbinder
2019-06-03 10:25:44 +08:00
@jinliming2 我在想如何通过配置文件和 service 实现 systemctl enable/disable scriptA@file1.conf 来控制是否替换可执行文件 file1
ps1aniuge
2019-06-03 16:31:23 +08:00
手机 rom 黑客的需求?夺权强插垃圾 rom ?
Oathbinder
2019-06-03 20:55:43 +08:00
@ps1aniuge 内部测试需要

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/570144

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX