简单来说就是有两个 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
这个方法的缺点就是每个需要替换的文件都要写这两个只有一行命令的脚本,看起来不是那么优雅。本来想通过一个配置文件记录所有要替换的文件和对应参数,但是这样的话一旦从配置文件中删除了一个替换记录那么脚本也就不知道哪些文件被替换了也就没办法恢复了。所以还有没有什么更优雅的方法来实现这个需求?
![]() | 1 sagaxu 2019-06-03 07:11:52 +08:00 via Android 还不如直接上容器 |
![]() | 2 des 2019-06-03 07:26:19 +08:00 via Android 建议用容器 |
3 jinliming2 2019-06-03 07:39:33 +08:00 via iPhone 可否用环境变量文件,EnvironmentFile,指定一个环境变量文件,在脚本 A 中根据环境变量来操作 B。 讲真,我没看太懂你的需求…… |
![]() | 4 des 2019-06-03 07:59:05 +08:00 via Android |
![]() | 5 hanxiV2EX 2019-06-03 08:09:59 +08:00 via Android 用 alias 指向函数? |
6 VDimos 2019-06-03 08:21:31 +08:00 via Android 一个 echo,一个 xargs 不就行了吗,干嘛用脚本去改脚本的内容 |
7 Oathbinder OP @sagaxu 因为涉及到底层固件,所以要在系统启动早期注入,也就不能在容器里面跑 @jinliming2 @des 不是修改文件才能跑起来,而是要把特点可执行文件替换掉,能够在特定条件下以特定值返回。 @VDimos 因为要保持替换后调用参数不变,比如用 B 替换 rm 后,你还是能够执行 rm -rf / |
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 |
9 Oathbinder OP @jinliming2 这个功能已经通过 B 实现了,现在需要通过 systemd 来控制哪些程序需要被替换,要求是能够通过 systemd 来控制替换开启 /关闭 |
10 jinliming2 2019-06-03 10:15:46 +08:00 via iPhone @Oathbinder 那可以在 B 里通过 socket file 与 A 通信查询,然后判断逻辑还在 B 里吗? 因为 systemd 只是一个服务管理系统,不太好做控制器的吧? |
![]() | 11 momocraft 2019-06-03 10:18:40 +08:00 感觉是 XY 问题 |
12 Oathbinder OP @jinliming2 我在想如何通过配置文件和 service 实现 systemctl enable/disable [email protected] 来控制是否替换可执行文件 file1 |
13 ps1aniuge 2019-06-03 16:31:23 +08:00 手机 rom 黑客的需求?夺权强插垃圾 rom ? |
14 Oathbinder OP @ps1aniuge 内部测试需要 |