我想将我运行的所有命令的日志(除历史记录外)连同其他描述一起保存在单独的日志文件中。为了实现这一点,我需要知道如何获取当前运行的命令并将其存储在文件中。
场景:目前,每当我运行 sudo 命令时,它都会询问原因,我会提供原因。原因存储在我目录中的日志文件中。但现在我想将运行的命令与原因一起存储,但我找不到这样做的方法。
$ sudo touch file
Reason for sudo: creating new file test
[sudo] password for root:
如上所述,sudo touch file
每次运行命令时,我都想将命令连同提供的原因一起存储在文件中。
答案1
您可以使用一个小函数来覆盖同名的命令,添加扩展,然后运行实际命令,例如sudo
(假设bash
):
sudo () {
read -p 'Reason for sudo: ' reason
printf 'sudo %s : %s\n' "$*" "$reason" >>~/reason_file.txt
command sudo "$@"
}
将其放入任何 shell 会话初始化文件中,例如~/.bashrc
。显然,您可以修改函数体以满足您的需要。
现在,当您运行时sudo some_command
,上述函数将运行并将执行定义的操作,然后最终sudo some_command
使用实际的sudo
外部二进制文件运行。
附注:所有 shell 都将交互式会话历史记录存储在单独的文件中,例如 for bash
it”s ~/.bash_history
、 for zsh
it's ~/.histfile
。history
内置命令将获取已保存(和缓冲)的历史记录。
答案2
谢谢您的建议。我使用我的别名.bashrc
和 shell 脚本实现了此目的。
alias sudo='bash $HOME/.sudolog'
脚本$HOME/.sudolog
#!/bin/bash
#Script to log the sudo commands used with reason.
## ##
#LAST UPDATED ON 24 FEB 2019 16:30 IST#
## ##
logfile="$HOME/sudo.log"
cmd="sudo $*"
date_time=`date +'%d/%m/%Y %H:%M:%S'` > /dev/null 2>&1
username=`whoami` > /dev/null 2>&1
read -p "Reason for sudo: " reason
eval $cmd
rtrn="$?"
echo "<date time> $date_time </date time> <user> $username </user> <command> sudo $* </command> <reason> $reason </reason> <return> $rtrn </return>" >> "$logfile"