将当前运行的命令存储在单独的文件中

将当前运行的命令存储在单独的文件中

我想将我运行的所有命令的日志(除历史记录外)连同其他描述一起保存在单独的日志文件中。为了实现这一点,我需要知道如何获取当前运行的命令并将其存储在文件中。

场景:目前,每当我运行 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 bashit”s ~/.bash_history、 for zshit's ~/.histfilehistory内置命令将获取已保存(和缓冲)的历史记录。

答案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"

相关内容