如何查看已完成的終端命令的所有先前輸出?

如何查看已完成的終端命令的所有先前輸出?

我在 gnome 終端機中執行了一個命令,該命令在終端機上列印的輸出比我預期的要多。我想讀取整個輸出,但終端滾動在到達開頭之前停止。

我知道我可以更改終端設定檔設定以啟用無限滾動,或將輸出透過管道傳輸到檔案等。未來然而,輸出。

如何查看已執行命令的完整終端輸出?

編輯:好吧,這是不可能的。謝謝大家!

答案1

我的經驗是,評論中的共識是正確的 - 一旦超出終端的緩衝區,數據就會丟失(或者就像 - 它可能在尚未被覆蓋的內存中) - 因此你無法追溯增加緩衝區大小。

這個答案介於評論、答案之間,也許對你的情況來說有點矯枉過正。這更像是一種可能解決您的情況的建議方法 - 特別是直到為時已晚才知道您需要日誌的問題(非因果問題很難),但這並不是您問題的直接答案。

無論如何,評論太長了。我沒有明確列出實現此方法所需的所有程式碼,主要是因為需要做出一堆實作決策;如果您需要更詳細的信息,我很樂意提供。

Script相處起來一點也不愉快

首先,該script實用程式被建議作為“權宜之計”,以防止資料遺失而不增加緩衝區大小(設定為無限制時會產生安全隱患)。如果說有哪個公用事業公司需要一些細心呵護的話,script那就是它了。話又說回來,它是核心團隊開發的。你可以隨意閱讀。

我發現script經常比它的價值更麻煩(對其進行後處理以使其半人類可讀等),並且開始使用簡化的方法來記錄 stdout、stdin 和/或 stderr。從某種意義上說,這是重新創建腳本,但具有完全控制權,而不是受硬編碼日誌記錄設定的支配script

這種方法可以相對無縫地整合到您的 shell 會話中,並且在極少數情況下,您確實溢出了終端緩衝區,您將擁有一個包含這些內容的臨時檔案。為了保持日誌記錄“乾淨”,您必須執行一些內務處理步驟。此外,預設情況下也會存在相同的安全性問題(所有終端輸出的日誌);然而,有一個簡單的方法可以加密日誌。

有 3 個基本步驟:

  1. 設定重定向,以便將 stdout(和 stderr,如果需要)拆分到檔案和終端。我讓這個範例保持簡單,並且沒有將 stdin 或 stderr 定向到文件 - 但是如果您理解 stdout 重定向範例,那麼其餘的事情就很簡單了。
  2. 配置 .bashrc,以便每當開啟 shell 時都會啟動此日誌記錄。
  3. 當給定的 shell 關閉時,使用內建的 bashTRAP呼叫使用者程式碼,這將終止會話日誌記錄(您可以刪除檔案、歸檔檔案等)

透過這種方法,您將有效地擁有一個看不見的安全網,該安全網將允許查看給定shell 會話的整個歷史記錄(基於您重定向的內容- 再次,為了簡化事情,我只顯示標準輸出);當你不需要它時,你甚至不應該知道它的存在。

細節

1. 配置重定向

以下程式碼片段將建立一個檔案描述符 3,它指向一個日誌檔案。 stdout 被重定向到 3,然後使用tee,我們將該串流拆分回終端(相當於 stdout)。您可以輕鬆地將 stderr 新增至同一命令/日誌文件,將其透過管道傳輸到不同的文件,或保留原樣(未記錄)。

logFile=$(mktemp -u)
exec 3>&1 1> >(tee $logFile >&3)
  • 您會發現這個日誌檔案比腳本產生的日誌檔案乾淨得多;它不儲存退格鍵、換行符和其他經常不需要的特殊字元。

  • 請注意,如果您希望對日誌檔案進行加密,您可以透過在 tee 命令之後添加額外的管道階段來相當輕鬆地做到這一點開放式SSL

2.自動化日誌生成

在.bashrc中加入與上面相同的程式碼。每次建立新 shell 時,都會建立特定於該會話的日誌檔案。

export logFile=$(mktemp -u)
exec 3>&1 1> >(tee $logFile >&3)
echo "Current session is being logged in $logFile"

3. shell關閉時自動關閉日誌記錄

如果您希望在會話結束時刪除日誌文件,您可以使用 bash 內建trap函數來檢測會話是否結束,並呼叫函數來處理日誌文件,例如(也在 .bashrc 中)。

trap closeLog EXIT

closeLog () {
  rm -f "$logFile" >/dev/null 2>&1
}

會話日誌記錄清理可以透過多種不同的方式進行處理。當 shell 透過捕獲「退出」訊號關閉時,將呼叫此方法。此時,您可以刪除日誌檔案、移動它/重新命名它,或進行任意數量的清理操作。您也可以透過 cron 作業而不是透過 TRAP 來清理日誌檔案(如果使用這種方法,如果您還沒有為 /tmp 目錄配置一個清理任務,我建議您執行定期清理任務;就好像bash shell 崩潰EXIT 陷阱不會被觸發)。

處理子 shell 的注意事項

子 shell 會出現一個有趣的情況。如果在現有的互動式 shell 之上開啟一個新的互動式 shell,則會建立一個新日誌,並且一切都應該正常運作。當退出該 shell(返回父級)時,將恢復登入該檔案。如果您想更乾淨地解決這個問題- 也許甚至維護子shell 的公共日誌(互動式或其他),您將需要檢測(在.bashrc 中)您是否位於嵌套子shell 中,並重定向到父級的日誌檔案而不是建立一個新的。您還需要檢查您是否位於子 shell 中,以便您的「陷阱」呼叫不會在退出時刪除父級的日誌檔案。您可以從 bash 環境變數 SLVL 取得嵌套 shell 級別,該變數儲存 shell 堆疊的「深度」。

請注意保持日誌“乾淨”:

如果您確實將標準輸入重定向到日誌文件,您最終將得到許多與腳本實用程式產生的相同的不需要的工件。這可以透過在重定向和檔案之間添加過濾器階段(例如 sed/grep)來解決。只需建立一個正規表示式來刪除您不想記錄的任何內容。要完全清理它需要一些相當深入的處理(可能在寫入檔案之前緩衝每個新行,清理然後寫入)。否則,將很難知道退格鍵何時是「垃圾」或有意的。

答案2

傳統的方法是使用 PuTTY 並保留數千行。還有螢幕,因為使用 PuTTY 的 Linux(或本地)用戶並不多。

現在,Windows 在命令列上提供了 ssh,但它已經被廢棄了。

相關內容