Bash:ssh 连接被对等方重置后历史记录丢失:如何保存历史记录?

Bash:ssh 连接被对等方重置后历史记录丢失:如何保存历史记录?

在我的中.bashrc我已经添加了:

# https://stackoverflow.com/a/40158199/9881330
function rescue_history {
    history -a
}
trap rescue_history SIGHUP

然而,这不起作用,因为之后client_loop: send disconnect: Connection reset by peer历史记录仍然丢失。这非常烦人,因为输入的有用命令全部丢失了!

核心问题:如何配置.bashrc在ssh连接被peer重置时保存历史记录?

非常困惑的是,默认情况下不启用这种“历史记录保存”行为。

我的.bashrc也有这个(如果有帮助的话):

# new history settings
# http://jesrui.sdf-eu.org/remember-all-your-bash-history-forever.html
HISTTIMEFORMAT='%F %T '
HISTFILESIZE=-1
HISTSIZE=-1
HISTCONTROL=ignoredups
#HISTIGNORE=?:??      # lines with one or two characters are discarded from the history (e.g. ls commands)
shopt -s histappend  # append to history, don't overwrite it
# attempt to save all lines of a multiple-line command in the same history entry
shopt -s cmdhist
# save multi-line commands to the history with embedded newlines
shopt -s lithist

答案1

您可以使用特殊变量在每次输入命令时PROMPT_COMMAND运行。history -a

PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND/%;};}history -a"

这将混合来自并发会话的命令,这可能会导致令人困惑的回滚。

为了克服这个问题,这里有一个稍微复杂的版本,它应该在每个会话的主目录中创建一个时间、tty 和 pid 标记文件。

SESSION_HISTORY_FILE="${HOME}/bash_history_$(date -d "$(ps -olstart= -p$$ | awk '{print $2,$3,$5,$4}')" +%F_%H-%M-%S)$(tty | tr / _)_$$"
PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND/%;};}history -a '${SESSION_HISTORY_FILE}'"

这里的想法是创建发出的命令的正确上下文记录。

对于终止的会话,您不会在向后滚动中看到这些(除非您添加了;history -a)。

相关内容