系统启动后只为 BASh 启用 LD_PRELOAD
Enable LD_PRELOAD just for BASh after system startup
有没有办法 inject/enable LD_PRELOAD 仅用于新会话(即:BASh
)?
我有一个语法高亮库,我想自动启用它(即:为某些用户突出显示警告),只需要为 BASh
而不是所有进程加载它。如果我把它放在 /etc/ld.so.preload
中,它会造成破坏并导致所有系统服务和其他不需要它的程序出现问题 运行,包装系统调用(printf
和 exec
为主)。
有没有简单的方法可以做到这一点?
最简单的解决方案可能是用执行 LD_PRELOAD
逻辑的 shell 脚本替换 bash
,然后调用实际的(重命名的)bash
二进制文件。
也就是将/bin/bash
移动到/bin/bash.original
,然后创建一个脚本/bin/bash
,内容如下:
#!/bin/sh
LD_PRELOAD=/path/to/my/library.so
export LD_PRELOAD
exec /bin/bash.original "$@"
如果您只想在连接到交互式会话时执行 LD_PRELOAD
,则可以在此处包含逻辑(例如 "is stdout a tty")。在 bash 未连接到 tty 时尝试执行任何类型的终端操作可能会产生奇怪的结果。
有没有办法 inject/enable LD_PRELOAD 仅用于新会话(即:BASh
)?
我有一个语法高亮库,我想自动启用它(即:为某些用户突出显示警告),只需要为 BASh
而不是所有进程加载它。如果我把它放在 /etc/ld.so.preload
中,它会造成破坏并导致所有系统服务和其他不需要它的程序出现问题 运行,包装系统调用(printf
和 exec
为主)。
有没有简单的方法可以做到这一点?
最简单的解决方案可能是用执行 LD_PRELOAD
逻辑的 shell 脚本替换 bash
,然后调用实际的(重命名的)bash
二进制文件。
也就是将/bin/bash
移动到/bin/bash.original
,然后创建一个脚本/bin/bash
,内容如下:
#!/bin/sh
LD_PRELOAD=/path/to/my/library.so
export LD_PRELOAD
exec /bin/bash.original "$@"
如果您只想在连接到交互式会话时执行 LD_PRELOAD
,则可以在此处包含逻辑(例如 "is stdout a tty")。在 bash 未连接到 tty 时尝试执行任何类型的终端操作可能会产生奇怪的结果。