我想修改我管理的系統上所有使用者的歷史記錄設定。我希望它包含來自連接終端的信息,例如來自who
sysadmin:/ # who
sysadmin pts/0 Mar 26 07:11 (sysadmin.doofus.local)
我目前透過以下方式修改我的歷史記錄。我知道其中許多設定已在此處介紹過多次。但是,我從“Linux 系統管理食譜作者:Juliet Kemp「 很久以前。
shopt -s histappend
PROMPT_COMMAND='history -n;history -a'
HISTSIZE=100000
HISTFILESIZE=100000
HISTTIMEFORMAT="%m/%d/%y %T "
shopt -s histappend
修復了多個終端機開啟時資訊可能遺失的問題。
PROMPT_COMMAND='history -n;history -a'
擴充以跨多個終端即時附加歷史記錄。
HISTSIZE=100000
HISTFILESIZE=100000
history
延長保留 量
HISTTIMEFORMAT="%m/%d/%y %T
「為每一行歷史打上時間戳
你通常會得到什麼 history
835 ls
836 cd ..
我修改後的當前history
結果
5853 03/26/12 07:16:49 ls
5854 03/26/12 07:16:50 ll
history
從我想看到的回報
5853 03/26/12 07:16:49 sysadmin.doofus.local ls
5854 03/26/12 07:16:50 sysadmin.doofus.local ll
001 03/26/12 05:11:29 demo_user.doofus.local cd
002 03/26/12 05:11:30 demo_user.doofus.local ll
我並沒有因為看到這個DNS
名字而「結婚」。我只希望它從who
或其他位置提取它,而不需要執行任何類型的查找或查詢。我會對 IP 位址感到滿意。
002 03/26/12 05:11:30 192.168.0.2 ll
為什麼?我管理多個系統,其中同一組的多個使用者共用一個使用者 ID 來執行日常任務。這將使我能夠將他們在組織內的真實位置和實際使用者與他們在歷史中所做的事情相關聯。
我知道這不是最佳選擇,並且想改變它,但是,當您乘坐遊輪大小的船上時,您不會嘗試急轉彎。 (註:當你這麼做時,乘客會試圖把你丟到海裡)
無論如何,在我能夠將它們遷移到更好的解決方案之前,我希望擁有這種追蹤能力。
另外,如果您對我目前用於history
修改的內容有任何建議,我很樂意聽到。
謝謝,
編輯:1
我不想運行其他程式或必須“在合理範圍內”配置任何額外的內容。
我想增加0
開銷,如果我必須添加的話,它需要很小。
我確實信任我的用戶,我只是想(如果發生什麼情況)看看使用相同的用戶:密碼登入系統的 10 個用戶中是哪一個執行了此操作。或者,它可能不是一個用戶,它可能cron
在作為用戶執行連接以執行某些操作的系統上被遺忘。或一個應用程式例如:BMC Control-M
連接ssh
並運行任務。與其說是找到“不良用戶”,不如說是能夠以最小的努力追蹤到它。
編輯2:
系統運行 SLES 和 RHEL
答案1
根據 llua 的建議,我們可以更多地研究歷史。將一行附加到系統範圍的 BASH RC 文件,可能是 /etc/bash.bashrc。
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'
在系統記錄器中設定「local6」的日誌記錄。也許是這樣的:
local6.* /var/log/commands.log
重新啟動系統記錄器。也許設定日誌文件輪換。登出;登入;並且,歷史記錄現在以如下格式寫入 /var/log/commands.log:
日期時間主機名稱記錄器:使用者名稱[audit_pid]:指令[return_val]
這可以進一步調整以適應口味。
答案2
以下段落大致描述了這個想法,並且在某些方面已經過時,但是您可以使用然後使用最新的這頁。讓我們使用一個大檔案 ~/.bash_history.archive (與 HISTFILE=~/.bash_history 分開)。然後在退出每個 bash 會話時向其添加新的歷史記錄行。
這種方法的第一個問題是:如何讓 bash 在每次退出時呼叫這個腳本?當然,如果你透過輸入「exit」退出它,那麼你可以為「exit」函數別名,但我使用快捷鍵Ctrl-D 來實現這一點,並且我找不到如何將其重新分配給某些東西但不是內建退出函數的方法。
所以第一次嘗試是:禁止 Ctrl-D
export IGNOREEOF=10
並定義雙 Ctrl-X 組合來呼叫退出函數。
但正確的方法是使用 bash 的 exit trapp,這是一個完美的解決方案,因為無論您以何種方式退出 bash,它都會被呼叫:Ctrl-D、退出、關閉 xterm 視窗。
trap 'archive_history' EXIT
下一步是在 bash_history 中定義起始行,以便我們只能儲存新行並確保附加到歷史文件中。
export CURBASHSTART=`grep -v "^[ \t]*$" $HISTFILE | wc -l | awk '{print $1}'` CURBASHDATE=`date`
shopt -s cmdhist histappend
這就是我們在 bash 開始時所需要的 - 現在我們知道當前(新)歷史從哪條歷史行開始。若要儲存歷史記錄,請將下一部分新增至 ~/.bashrc 中。
archive_history()
{
HISTORYOLD=${HISTFILE}.archive
CURTIME=`date`
CURTTY=`tty`
if [ x$HISTDUMPPED = x ]; then
echo "#-${HOSTNAME}-- ${CURBASHDATE} - ${CURTIME} ($CURTTY) ----" >> $HISTORYOLD
history $(($HISTCMD-${CURBASHSTART-0})) | sed -e 's/^[ ]*[0-9][0-9]* [ ]*//g' >> $HISTORYOLD
export HISTDUMPPED=1
fi
}
exit ()
{
archive_history
builtin exit
}
檔案 ~/.inputrc 應包含下一行來重新定義 Ctrl-x x 的退出捷徑。第一次嘗試時,您可能會覺得這是一個糟糕的捷徑,但後來您就會習慣它 - 相信我。
$if Bash
# to exit through calling exit function which will archive the history
"\C-x\C-x": "exit\n"
# to dump history we have so far
"\C-x\C-w": "archive_history\n"
$endif
另外,如果您的 bash 會話是登入會話並且您透過呼叫 ' logout
' 退出,那麼您可以將下一行新增到您的~/.bash_logout
archive_history
完成所有提到的操作後,您可以找到~/.bash_history.archive
包含以下部分的文件
#-belka-- Sun Oct 12 21:52:13 EDT 2003 - Sun Oct 12 21:53:25 EDT 2003 (/dev/pts/13) ----
exit
aptitude
exit
#-washoe-- Sun Oct 12 18:03:16 EDT 2003 - Sun Oct 12 23:06:48 EDT 2003 (/dev/pts/3) ----
exit
cd progr/letters/resume/
e resume.tex
如果您願意,通常可以像平常的歷史文件一樣讀取它。