使用 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 -v
或set -x
有用,結合將 stderr 重定向到記錄器的管道中。然而它並不完美,因為它還從您運行的程式中重定向 stderr。 (在 Bash 中,您可以選擇不同的檔案描述符進行set -x
寫入,這可以解決該問題。)
我想指出的是,如果你去的
ssh host some_command
話,就不會涉及互動式或登入 shell,因此你的 rc 檔案不會被加載,這將繞過你的日誌記錄。