2013-10-25 35 views
1

是否有可能以編程方式捕獲Linux上正在運行的進程的stdout(和stdin)? (也許重定向到管道?)以編程方式重定向正在運行的進程的stdout?

如果解決方案在用戶空間中工作(意思是不需要root權限)將是最好的。

我見過an answer apparently using gdb,但我想這樣做沒有gdb。

編輯:澄清:不,我沒有訪問代碼,我也不想更改二進制文件,我希望解決方案從單獨的進程中工作。無論如何,目標進程已經在運行。

+0

您可能會在unix.stackexchange.com上得到更快更好的答案 –

+0

您指出的問題是否包含使用'strace'的選項? – devnull

+0

嗯......strace的建議看起來很有趣,儘管我強烈希望能夠實際上_redirect_輸出(如主題行中所述),以便原始目標斷開連接,並且IIUC strace允許我只是「竊聽」通訊。 (具體來說,我的首選解決方案似乎更通用,並允許strace-like作爲特例。) – akavel

回答

3

從過程本身內(假設你可以在C改變它的代碼),你可以嘗試freopen(3),也許

FILE*newout = freopen("/some/path", "w", stdout); 
if (!newout) { perror("freopen"); exit (EXIT_FAILURE); } 
stdout = newout; 

參見stdio(3)。 (否則dup2STDOUT_FILENO)。

從過程之外,你可能也許/proc/$PID/fd/dup2(2),或重定向,或tee(1),該/proc/$PID/fd/0爲您處理$PID標準輸入打,/proc/$PID/fd/1爲您的流程$PID等的標準輸出有關更多信息,請參見proc(5)

+0

澄清:不,我無法訪問代碼,我也不想更改二進制文件,I希望解決方案能夠從單獨的過程中工作。假設目標進程已經在運行。 – akavel

+0

嗯! dup2()的想法聽起來很有趣! – akavel

1

嗯,提醒自己:閱讀一些其他類似的問題之後,這裏有一些有前途的項目,這可能會幫助我找到答案(?):

1

如果您已經開始此過程,則可以使用gdb實際重定向stdoutstrace以截獲對write et.al.的調用。

如果您不想使用gdbstrace您可能需要基本上做同樣的事情。他們正在做的魔術是使用ptrace函數來追蹤其他進程。這將要求您有權跟蹤程序(其中gdbstrace要求),作爲普通用戶,您無法跟蹤其他用戶的程序。

Linux Journal有一篇關於playing with ptrace的文章,它顯示了你如何做到這一點。有一點需要注意的是,這將取決於平臺:您必須專門爲您使用的平臺編寫代碼,文章似乎有(32位)x86平臺的示例。

相關問題