2015-12-09 16 views
7

chciałbym osiągnąć następujące:Ruby - set_trace_func na rozdwojonych procesów

Budowanie Ruby narzędzia wiersza polecenia, który rejestruje pewne set_trace_func zdarzenia, a następnie wywołuje cokolwiek ruby-wykonywalny argumentem przechodzą do niej (słownie rspec). Zarejestrowane zdarzenia przenoszą się następnie do wywoływanego polecenia.

Pseudo kod z myutility:

set_trace_func() # Set some events here 

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

Następnie zadzwonić jako myutility rspec.

Moim celem jest w rzeczywistości rejestrowanie śladów punktów na dowolnych poleceniach (o ile używają podkładek ruby).

Czego próbowałem:

  1. exec nie działa, z oczywistych powodów (zastępuje proces całkowicie).
  2. popen, system, backticks. Rozpoczynają niezależny proces.

Mogę użyć jakiejś formy IPC, ale to przejmuje kontrolę nad poleceniem, które wywołuję za pomocą mojego narzędzia. Nie o to chodzi; Chciałbym zaakceptować dowolne argumenty wykonywalne w języku Ruby.

Czy to możliwe? Jedną rzeczą, której nie przyjrzałem się bliżej, jest drb, ale to też zakłada pewną ingerencję w zewnętrzne argumenty.

Odpowiedz

0

Możesz wprowadzić trochę kodu do procesu ruby, dodając argumenty do interpretera ruby, więc twoje narzędzie może zostać podzielone na dwie części - runner i payload. Ładowność jest po prostu inny skrypt, rejestruje dla set_trace_func itp upon wymagać, a drugie miejsce wstrzyknięcia były w scenariuszu docelowym tak:

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

To sprawi, rubin do require swój ładunek w procesie, a potem postępować z systemem cel sam skrypt (ładunek zostanie uruchomiony, nawet jeśli skrypt docelowy nie może się skompilować)

+0

Awesome. Robiłem ruby ​​-r z wiersza poleceń; nie wiedziałem, że exec to umożliwia. To jest poprawna odpowiedź. Jedno szybkie pytanie: jak mogę to wykonać za pomocą poleceń, które same wywołują ruby? Jak rspec. Obecnie stoi za błędem mówiąc, że nie może znaleźć rspec, naturalnie. –

+0

o ile pamiętam - rspec domyślnie nie wywołuje ruby, ale może pracować nad drbem, możesz też uruchamiać 'wiosenny' plik wykonywalny – Vasfed

+0

jak w przypadku błędu "nie znaleziono" - ponieważ działa bez powłoki musisz rozwiązać Skryptuj pełną ścieżkę samodzielnie (lub przechodząc do 'which' before/in runner) – Vasfed