簡體   English   中英

在后台C ++程序/ bash腳本中捕獲linux命令的輸出

[英]Catching output of linux command in background C++ program / bash script

我想創建將在后台運行的c ++程序或bash腳本,例如,每當我使用選擇的命令時

pwd它將捕獲該命令的輸出,即~Desktop/folder1 ,它將輸出更改為You are in ~Desktop/folder1 因此,結果是該用戶在使用命令pwd將僅看到You are in ~Desktop/folder1

pwd命令只是示例,我想修改其他命令(如ls,ps等)的輸出。

我希望腳本在所有終端中都能正常工作,也就是說,如果我打開另一個終端,它仍然會在該終端中捕獲所選命令的輸出。

題:

甚至有可能做這樣的事情的c ++程序或bash腳本嗎?

您可以將shell函數定義放入您的bash環境配置腳本中,以達到您描述的效果。 例如,

〜/ .bash_profile:

# ...

pwd() {
  echo You are in $(command pwd)
}

export -f pwd

請注意,使用command命令可避免在shell函數pwd遞歸。 另請注意export -f將功能導出到子進程。 對於要覆蓋的每個命令,您都需要一個類似的代碼段。

根據您的系統和配置,將它們放在~/.bashrc可能更合適。 或者,如果您希望它適用於每個用戶,則可以將其放在系統級bash配置腳本之一中。 但是請注意,用戶將能夠覆蓋它。

首先,您的問題中缺少兩個重要參數。 首先是哪些外殼需要受到此影響。 這應該是系統范圍的嗎? 只有一個用戶? 只是特定用戶的幾個特定Shell?

第二個缺少的參數是需要哪些權限。 這是根應該做的事情嗎? 非特權用戶?

您希望攔截的每個此類命令都是一個系統調用。 通常它是execve ,但有時它更具體(例如,根據定義, pwd是內部shell命令)。 假設您不希望編寫內核模塊(做您想要的事情的唯一真實方法),那么您將不得不變得更有創造力。

一種選擇是用滿足您需要的替代版本替換文件系統上的所有相關文件。 當然,如果您不是root用戶,這是不可能的。

使用非特權用戶更可能的另一種選擇是使用ptrace接口來控制您希望控制的Shell進程。 但是請注意,這非常復雜,性能低下,並且只能與運行C ++程序的用戶在同一用戶上使用。 此外,最近的內核還提供了進一步的保護,以防止簡單地作為調試器附加到隨機進程,這意味着您將需要禁用它(需要root),或者通過程序運行受影響的shell。

已經執行類似操作的一個程序是<shameless_plug> fakeroot-ng </ shameless_plug>。 它設置調試器,並將其附加到外殼程序上,以便為它提供與實際系統不同的視圖。 您可以嘗試破解代碼以執行所需的操作。 使用multithreaded_debugger分支可能會更容易,但是仍然不夠穩定。

您問錯了問題。

如果您要隱藏一組進程和文件,則/etc/ld.so.preload是您的朋友。

您需要做的是編寫一個共享對象文件,該文件以某種方式重新實現readdirreaddir_r (兩個函數應該或多或少地實現),以確保如果有人嘗試獲取該目錄的內容, “隱藏”文件是,您在答復中忽略了文件。 同時,如果有人嘗試獲取/ proc /目錄的內容,則將忽略與您要隱藏的進程相對應的目錄。

您可以通過緩存其inode / dev對並檢查它來輕松查看這是否是您希望將響應更改為的目錄。 這將對重命名,符號鏈接等具有彈性。

在網上搜索如何編寫LD_PRELOAD模塊,以獲取有關如何菊花鏈連接功能本身的說明。 這比修改每個二進制文件少得多。 如果您知道自己在做什么,則可以將其包裝成約200行代碼。

現在來了。 您無需將LD_PRELOAD環境變量放入每個進程。 只需在/etc/ld.so.preload和viola中列出您的共享庫(用LD_PRELOAD測試后)即可! 系統中的所有進程都將注入您的庫。

不要忽略測試建議。 在/etc/ld.so.preload中列出錯誤的文件可能會使您的系統完全無法使用。

要獲得額外的好處,請在完成后安裝chkrootkit並運行它,並觀察它抱怨您的系統已受到威脅。 這是rootkit用來隱藏自身的(許多)技術之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM