Ruby - 在分叉进程上的set_trace_func

n_x*_*x_l 7 ruby trace ipc

我想实现以下目标:

构建一个Ruby命令行实用程序,它注册一些set_trace_func事件,然后调用你传递给它的任何ruby-executable参数(比如说rspec).然后,已注册的事件将继承到调用的命令.

伪代码myutility:

set_trace_func() # Set some events here

exec(ARGV.join(' ')) # Execute argument passed
Run Code Online (Sandbox Code Playgroud)

然后打电话给myutility rspec.

我的目标是在任意命令上实际注册跟踪点(只要它们使用ruby垫片).

我尝试过的事情:

  1. exec 由于显而易见的原因(它完全取代了这个过程)不起作用.
  2. popen,系统,反引号.这些开始一个独立的过程.

我可以使用某种形式的IPC,但它假设控制我用我的实用程序调用的命令.不是这种情况; 我想接受任意Ruby可执行参数.

这可能吗?我没有密切关注的一件事是drb,但这也假设对外界争论有些干扰.

Vas*_*fed 0

您可以通过向 ruby​​ 解释器添加参数来将一些代码注入到 ruby​​ 进程中,这样您的实用程序就可以分为两部分 - 运行程序和有效负载。Payload 只是另一个脚本,它set_trace_func根据需要进行注册等,并且运行程序将前者注入到目标脚本中,如下所示:

exec('/usr/bin/env', 'ruby', '-r', payload_full_filename, *ARGV)
Run Code Online (Sandbox Code Playgroud)

这将使 rubyrequire​​ 首先进入您的有效负载,然后继续运行目标脚本本身(即使目标脚本无法编译,有效负载也会运行)