登录时在 bashrc 中查看历史记录与手动获取历史记录 - 清除和加载

登录时在 bashrc 中查看历史记录与手动获取历史记录 - 清除和加载

我在工作中使用了许多不同的 aix 机器,需要与同事共享用户。

为了让我的生活更轻松,但不让我的定制打扰别人,我创建了一个 .bashrc 文件,每当我必须使用新主机时,我都会将其复制到 /tmp/matthewh。

我的 .bashrc 设置了一个新的历史文件,因此我的个人命令历史记录与使用同一台机器和用户的其他命令历史记录保持隔离。

# History options
export HISTTIMEFORMAT="%F %T "
export HISTCONTROL=ignorespace 
export HISTSIZE=2000
export HISTFILESIZE=2000
export HISTFILE="/tmp/matthewh/$USER.bash_history"

复制文件后,我连接到ssh user@host -t "bash --rcfile /tmp/matthewh/.bashrc"

这很完美。当我切换到另一个用户并获取 .bashrc 文件时,就会出现问题。

$ su - apache
$ . /tmp/matthewh/.bashrc

问题是,最初su - apache从 ~/.bash_history 加载 apache 的历史记录,然后当我 source .bashrc 时,已经太晚了。历史记录文件已正确更改,但已被加载。我可以通过运行来修复此问题history -c && history -r,所以我需要做的就是将其也放入 .bashrc 中,一切都应该没问题,对吗?

ssh不幸的是,如果我把它放在我的 .bashrc 文件中,当我使用和选项登录时,它会破坏一切-t "bash --rcfile /tmp/matthewh/.bashrc"。由于它将其作为登录 shell,因此加载历史记录是该过程的一部分。这意味着history -r.bashrc 中的第二次加载历史记录,我的工作历史记录是应有的两倍。

.bashrc 有没有办法检测它是手动获取还是从登录 shell 获取,以便它只能有条件地清除和重新加载历史记录?

答案1

不要清除并重新加载 rc 文件中的历史记录,而是将其推迟到 shell 发出第一个提示时:

PROMPT_COMMAND='unset PROMPT_COMMAND; test -f $HISTFILE && history -c && history -r $HISTFILE'

答案2

一种方法是查找 SSH 变量是否已设置:

SSH_CLIENT='...'
SSH_CONNECTION='...'
SSH_TTY=/dev/pts/1

当你“su -”时,这些将不会在新环境中设置。因此,你可以添加类似以下内容的内容:

[ -z "$SSH_TTY" ] && history -c && history -r

答案3

一种解决方案是检查历史文件是否为空:

# If this was sourced manually history will not be empty
currhistsize="`history | wc -l`"
if [[ "${currhistsize// }" != "0" ]]; then
    # Clear the old history, then reload the correct history
    history -c
    history -r
fi

必须使用 ${currhistsize// },因为它有一堆需要删除的前导空格。

不过,这感觉像是一种变通方法,而不是真正的解决方案。我非常想知道一种检查文件是手动获取还是从 shell 初始化获取的正确方法。

答案4

好的,这是另一个想法。每个 bash 会话都将具有唯一的 ID。为了确保你也可以创建一个唯一的时间戳。这不会直接解决你的问题,而且我不确定这是否会在我编写时起作用,但任何新的 shell 都会根据 PID 和时间戳创建自己的历史文件

你可以在 .bashrc 中输入类似

mypid=echo $$
mydatestamp=`date +"%Y%m%d_%H%M%S"`
export HISTFILE="/root/historyfiles/$mypid.$mydatestamp.bash_history"

这样至少可以将所有东西分开。

未经测试,因此如果您采用这种类型的想法,可能需要对其进行调整直到它起作用:)

相关内容