捕捉儀表板外殼的 DEBUG 訊號?

捕捉儀表板外殼的 DEBUG 訊號?

使用 bash shell,您可以在合成訊號上安裝陷阱DEBUG。這很有用,將在每個 shell 命令上執行您的函數或程式碼段。例如:

$ trap 'logger -t shell "${BASH_COMMAND}"' DEBUG

例如,這裡的想法是將陷阱安裝在放入的檔案中,/etc/profile.d/bash-logger並讓任何使用者 shell 會話命令在發生時自動記錄到系統日誌中。這也很有用輕鬆追蹤遠端命令

查看 dash shell 原始碼,我似乎明白沒有這樣的DEBUG訊號可用。

是否有任何解決方法或替代方案可以使用 dash shell 實現相同的結果?

答案1

最徹底的方法是重新編譯 shell 並啟用 syslog 支援。這也繞過了(無論出於何種原因)不加載 ~/.任何-profile 或 ~/.任何-rc。

這會作為 Bash 標準來源中的選項包含在內,但對於其他 shell,您可能需要尋找或編寫修補程式。

我會猶豫是否建議eval逐行閱讀和 ing,因為命令可以跨越多行,並且eval半個命令要么失敗,要么做錯誤的事情。受影響的命令類型包括:管道和條件命令(每行以&&,||或結尾|)、複合命令(包括括號組)、以反斜杠繼續的行、多行引用字串和<<此處文檔。 (可能比我沒想到的還要多。)

對於有限的情況,您可能會發現set -vset -x有用,結合將 stderr 重定向到記錄器的管道中。然而它並不完美,因為它還從您運行的程式中重定向 stderr。 (在 Bash 中,您可以選擇不同的檔案描述符進行set -x寫入,這可以解決該問題。)

我想指出的是,如果你去的 ssh host some_command 話,就不會涉及互動式或登入 shell,因此你的 rc 檔案不會被加載,這將繞過你的日誌記錄。

相關內容