Ruby - set_trace_func 在分叉进程上
Ruby - set_trace_func on forked processes
我想实现以下目标:
构建一个 Ruby 命令行实用程序来注册一些 set_trace_func 事件,然后调用您传递给它的任何 ruby-可执行参数(比如 rspec
)。注册的事件然后转移到调用的命令。
myutility
的伪代码:
set_trace_func() # Set some events here
exec(ARGV.join(' ')) # Execute argument passed
然后调用 myutility rspec
.
我这里的objective实际上是在任意命令上注册跟踪点(只要它们使用ruby垫片)。
我尝试过的事情:
exec
不起作用,原因很明显(它完全取代了过程)。
- popen,系统,反引号。这些启动一个独立的进程。
我可以使用某种形式的 IPC,但这假定控制我使用我的实用程序调用的命令。不是这种情况;我想接受任意 Ruby- 可执行参数。
这可能吗?我没有仔细研究过的一件事是 drb,但这也假设了对外部参数的一些干扰。
您可以通过向 ruby 解释器添加参数将一些代码注入 ruby 进程,因此您的实用程序可以分为两部分 - 运行ner 和 payload。 Payload 只是另一个脚本,它根据需要注册 set_trace_func
等,运行ner 将前者注入目标脚本,如下所示:
exec('/usr/bin/env', 'ruby', '-r', payload_full_filename, *ARGV)
这将使 ruby 到 require
您的有效负载首先进入进程,然后继续 运行ning 目标脚本本身(即使目标脚本不能,有效负载也会 运行编译)
我想实现以下目标:
构建一个 Ruby 命令行实用程序来注册一些 set_trace_func 事件,然后调用您传递给它的任何 ruby-可执行参数(比如 rspec
)。注册的事件然后转移到调用的命令。
myutility
的伪代码:
set_trace_func() # Set some events here
exec(ARGV.join(' ')) # Execute argument passed
然后调用 myutility rspec
.
我这里的objective实际上是在任意命令上注册跟踪点(只要它们使用ruby垫片)。
我尝试过的事情:
exec
不起作用,原因很明显(它完全取代了过程)。- popen,系统,反引号。这些启动一个独立的进程。
我可以使用某种形式的 IPC,但这假定控制我使用我的实用程序调用的命令。不是这种情况;我想接受任意 Ruby- 可执行参数。
这可能吗?我没有仔细研究过的一件事是 drb,但这也假设了对外部参数的一些干扰。
您可以通过向 ruby 解释器添加参数将一些代码注入 ruby 进程,因此您的实用程序可以分为两部分 - 运行ner 和 payload。 Payload 只是另一个脚本,它根据需要注册 set_trace_func
等,运行ner 将前者注入目标脚本,如下所示:
exec('/usr/bin/env', 'ruby', '-r', payload_full_filename, *ARGV)
这将使 ruby 到 require
您的有效负载首先进入进程,然后继续 运行ning 目标脚本本身(即使目标脚本不能,有效负载也会 运行编译)