Linux 在sh脚本运行期间临时替换文件
在设置几个环境变量后,我使用sh脚本在后台启动应用程序。我使用临时变量从不同的位置使用LD_LIBRARY_PATH和临时变量启动二进制文件。问题是应用程序从硬编码路径加载一个*.so文件,我无法更改该路径。目前,我通过用符号链接替换硬编码的文件位置来手动解决这个问题 你能告诉我是否有一个干净的解决方案来解决这个问题吗?基本上,我想要的是,某个文件位置仅在脚本启动的应用程序的打开调用中使用不同的二进制文件进行切换,对于所有其他进程,它应该保持不变Linux 在sh脚本运行期间临时替换文件,linux,sh,Linux,Sh,在设置几个环境变量后,我使用sh脚本在后台启动应用程序。我使用临时变量从不同的位置使用LD_LIBRARY_PATH和临时变量启动二进制文件。问题是应用程序从硬编码路径加载一个*.so文件,我无法更改该路径。目前,我通过用符号链接替换硬编码的文件位置来手动解决这个问题 你能告诉我是否有一个干净的解决方案来解决这个问题吗?基本上,我想要的是,某个文件位置仅在脚本启动的应用程序的打开调用中使用不同的二进制文件进行切换,对于所有其他进程,它应该保持不变 关于。将open(“/the/original”
关于。将
open(“/the/original”)
替换为open(“/some/other”)
的示例方法:
一个简单的方法是修改可执行文件中的路径名。
首先将原始可执行文件复制到类似“修改”的地方并运行
类似于(类似于vim
)的实用程序。
从新旧路径长度的比较看2种情况:
- 当(新长度原始长度)时,创建一个参考
新的较长路径名,如下面的示例所示,然后覆盖原始路径名
使用短符号链接路径名
ln-s/full/path/some/new/file/shorter
bvi
保存更改后,测试新复制+更改的可执行文件。
一旦“修改”符合计划,也可以为方便而重命名:
mv xyz xyz.orig
mv修改的xyz
另一种方法可以满足透明度要求。 创建一个动态库(例如
custom.so
),其中包含
open()
,它有条件地替换路径名并调用实际路径名
libcopen()
。使用另一个文件运行未修改的原始可执行文件(xyz)
环境变量,例如:
LD_PRELOAD=/path/to/custom.so xyz
有一些折衷与通用性和适度的复杂性;
原始xyz保持不变,并且始终可以在带/不带LD_PRELOAD
的情况下运行;
有些人可能会认为包装的附加开销是不需要的;
不适用于静态链接或设置uid可执行文件
许多文章提供了有关创建预加载库、重新使用的说明
原始符号,如
open()
(常见示例为malloc()
),调用dlsym()
一次以查找常规libcopen()
,将结果保存为函数指针,并间接调用libcopen()
。设置LD\u LIBRARY\u路径
后,是否可以运行ldd应用程序,发布输出,并指定感兴趣的.so
?原始帖子中的第二段不清楚(文件位置,不同的二进制文件),你能详细说明一下吗?猜测:对于一个应用程序,是否要将open(“/original/file”,)
替换为open(“/some/other/file”,”,)
。对于这一进程,open(“/original/file”,,)应该解释为open(/some/other/file”,),并且对它是透明的。也许您可以chroot
yout将进程放入一个专门准备的环境中。(请注意,那些发现chroot难以使用容器的人。)