配置目的:
隐私、安全
cat /etc/profile.d/history.sh
####Operation log####
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
export HISTTIMEFORMAT="[%F %T][`whoami`][${USER_IP}] "
echo "" > .bash_history
export PROMPT_COMMAND='\
if [ -z "$OLD_PWD" ];then
export OLD_PWD=$PWD;
fi;
if [ -z "$LAST_CMD" ]; then
logger -t shell_cmd "[$OLD_PWD]$(history 1)";
fi ;
if [ ! -z "$LAST_CMD" ] && [ "$(history 1)" != "$LAST_CMD" ]; then
logger -t shell_cmd "[$OLD_PWD]$(history 1)";
fi ;
export LAST_CMD="$(history 1)";
export OLD_PWD=$PWD;'
- 获取用户IP地址:
bash
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
who -u am i
:这个命令用于显示当前登录用户的信息。-u
选项通常用于显示用户的登录时间、登录终端等信息,但在这个上下文中可能不是必需的,因为主要目的是获取用户名和登录终端。am i
是一个常见的用法,用于仅显示当前用户的信息。2>/dev/null
:将标准错误重定向到/dev/null
,意味着忽略错误信息(例如,如果用户不在终端上登录,who -u am i
可能会失败)。awk '{print $NF}'
:使用awk
打印每行的最后一个字段,这通常是登录终端(例如pts/0
)。sed -e 's/[()]//g'
:使用sed
删除所有的括号字符。这是因为登录终端信息可能包含括号,例如(tty1)
,而这里只想要纯文本形式的终端名。
- 设置历史命令的时间格式:
bash
export HISTTIMEFORMAT="[%F %T][`whoami`][${USER_IP}] "
- 这行命令设置了历史命令的时间格式,包括日期(
%F
)、时间(%T
)、当前用户名(`whoami`
)和用户IP地址(${USER_IP}
)。
- 这行命令设置了历史命令的时间格式,包括日期(
- 清空历史记录文件:
bash
echo "" > .bash_history
- 这行命令将
.bash_history
文件清空,意味着每次启动 shell 时,之前的命令历史都会被清除。
- 这行命令将
- 配置命令执行后的行为:
bash
export PROMPT_COMMAND='\
if [ -z "$OLD_PWD" ];then
export OLD_PWD=$PWD;
fi;
if [ -z "$LAST_CMD" ]; then
logger -t shell_cmd "[$OLD_PWD]$(history 1)";
fi ;
if [ ! -z "$LAST_CMD" ] && [ "$(history 1)" != "$LAST_CMD" ]; then
logger -t shell_cmd "[$OLD_PWD]$(history 1)";
fi ;
export LAST_CMD="$(history 1)";
export OLD_PWD=$PWD;'
PROMPT_COMMAND
是一个环境变量,它在每次显示命令提示符之前执行。这里它被设置为一个复杂的if
语句块,用于记录命令执行的上下文。- 首先,如果
OLD_PWD
(上一个工作目录)为空,则将其设置为当前工作目录($PWD
)。 - 然后,如果
LAST_CMD
(上一个执行的命令)为空,使用logger
命令记录当前工作目录和刚刚执行的命令(通过history 1
获取)。 - 接着,如果
LAST_CMD
不为空,并且刚刚执行的命令与LAST_CMD
不同,也记录这个新命令。 - 最后,更新
LAST_CMD
和OLD_PWD
的值。
总的来说,这段代码的目的是在每次执行命令时,记录命令的执行时间、执行用户、用户IP地址、当前工作目录以及命令本身,使用 logger
命令将这些信息写入系统日志。这有助于审计和监控用户的 shell 活动。