2015-12-09 100 views
7

set_trace_func我想實現以下目標:紅寶石 - 對派生進程

構建Ruby命令行實用程序,註冊一些set_trace_func事件,然後調用你通過什麼紅寶石可執行文件的參數給它(比如rspec)。註冊的事件隨後傳遞給調用的命令。

myutility僞代碼:

set_trace_func() # Set some events here 

exec(ARGV.join(' ')) # Execute argument passed 

然後調用爲myutility rspec

我在這裏的目標是實際上任意命令(只要他們使用紅寶石墊片)的寄存器跟蹤點。

事情我已經嘗試:

  1. exec不行的,原因很明顯(這完全取代的過程)。
  2. popen,system,反引號。這些開始一個獨立的過程。

我可以使用某種形式的IPC,但是假定控制了我用我的實用程序調用的命令。不是這種情況;我想接受任意的Ruby可執行參數。

這可能嗎?我沒有仔細看過的一件事就是drb,但這也妨礙了外界的爭論。

回答

0

您可以通過向ruby解釋器添加參數來將一些代碼注入到ruby進程中,因此您的實用程序可以分爲兩部分 - runner和payload。有效載荷僅僅是另一個腳本,它註冊爲set_trace_func等要求時,和亞軍注入前者爲目標腳本,像這樣:

exec('/usr/bin/env', 'ruby', '-r', payload_full_filename, *ARGV) 

這將使紅寶石require您的有效載荷送入過程,然後再與運行的目標前進腳本本身(即使目標腳本無法編譯,負載也會運行)

+0

太棒了。我從命令行做ruby -r;不知道高管是否允許這樣做。這是正確的答案。一個快速跟進問題:我如何使用自己調用ruby的命令來完成這項工作?像rspec一樣。現在它通過一個錯誤說,它無法自然地找到rspec。 –

+0

我記得 - rspec默認情況下不會調用ruby,但可以在drb上運行,也可以運行到'spring'-executable可執行文件 – Vasfed

+0

,因爲'not found'錯誤 - 因爲沒有shell運行,您必須解決腳本完整路徑你自己(或通過傳遞給'which'在跑步者之前/之內) – Vasfed