我想覆盖预编译可执行文件中存储的一些硬编码路径,例如“/usr/share/nmap/”,并将它们重定向到另一个目录。
我理想的解决方案不应该需要 root 权限,因此创建符号链接是不行的。
(也不能重新编译)
答案1
perl -pe 's:/usr/share/nmap/:/other/dir/nmap/:g
' /path/to/executable > new-executable
/other/dir/nmap
应与 的长度相同/usr/share/nmap
。/
如果没有,您可以用字符填充:
perl -pe 's:/usr/share/nmap/:/other//////dir/:g
' /path/to/executable > new-executable
新的路不能再长了。/tmp
如果这是一个问题,您始终可以选择创建符号链接。
答案2
参考@slm的回答...
第三种方法来做到这一点可能创建一个用于运行可执行文件的 chroot 沙箱环境,其中除了要重新映射的可执行文件之外的所有内容都将定向到真实的东西。但这会很复杂。
但我建议获取源代码并重新编译。 (或者,如果这是专有代码,请向供应商付费,让他们为您提供一些自定义可执行文件......)
答案3
我前世所做的就是小心hexl-mode
使用二进制编辑器(例如在 emacs/xemacs 中)编辑可执行文件以替换字符串(替换必须更短,用零个字符填充!) 。
如果可执行文件包含固定路径,则通常可以使用环境变量(如 TMPDIR、EDITOR/VISUAL 或类似变量)或提供适当的参数来覆盖它们。当道路真正确定后,我会询问其背后的原因。可能有安全或配置说明,但不应该被覆盖。当然,这可能只是懒惰,但是对于您的发行版打包的软件来说这是不可能的,并且可能经过审查......