我想实现以下目标:
构建一个注册一些set_trace_func事件的Ruby命令行实用程序,然后调用传递给它的任何ruby-executable参数(比如rspec
)。然后,已注册的事件将继承到调用的命令。
myutility
的伪代码:
set_trace_func() # Set some events here
exec(ARGV.join(' ')) # Execute argument passed
然后拨打myutility rspec
。
我的目标是实际在任意命令上注册跟踪点(只要他们使用ruby垫片)。
我尝试过的事情:
exec
由于显而易见的原因(它完全取代了这个过程)不起作用。 我可以使用某种形式的IPC,但是它假设控制我用我的实用程序调用的命令。不是这种情况;我想接受任意Ruby可执行参数。
这可能吗?我没有密切关注的一件事是drb,但这也假设对外界争论有些干扰。
答案 0 :(得分:0)
您可以通过向ruby解释器添加参数将一些代码注入ruby进程,因此您的实用程序可以分为两部分 - runner和payload。 Payload只是另一个脚本,它根据需要注册set_trace_func
等,而转轮将前者注入目标脚本,如下所示:
exec('/usr/bin/env', 'ruby', '-r', payload_full_filename, *ARGV)
这将使你的有效负载的require
首先进入进程,然后继续运行目标脚本(即使目标脚本无法编译,有效负载也会运行)