不同session的history操作同步问题

简介: ~ openssh不同时间开的不同session,相同用户的history命令显示的是不完全相同的…不过bash的设计是有它的考虑的...要不chsh到zsh用用... 可能影响session的history选项就如下几个: 简单源码了解 源码看,暂时没有查出什么时候会统一写入 .bash_history文件!小坑要小心呀 几个简单的实验,不同session的bash hi

惊恐openssh不同时间开的不同session,相同用户的history命令显示的是不完全相同的…不过bash的设计是有它的考虑的...要不chsh到zsh用用...安静

可能影响session的history选项就如下几个:


简单源码了解

源码看,暂时没有查出什么时候会统一写入 .bash_history文件!小坑要小心呀委屈


几个简单的实验,不同session的bash history是不同步的!

处理方式1

参考地址


处理方式2

参考地址

四个脚本备忘://注意将.bashrc.user&bash_history_all_append.sh在.bashrc或其他登录shell中添加执行.

1. ${HOME}/.bashrc.user

if [[ `tty` != "not a tty" ]] ; then # interactive shell

  ##################################
  # BEG History manipulation section
    export TTY_NAME=`tty|sed -e 's|/dev/||' -e 's|/|_|'`
    export HISTFILESIZE=2000
    export HISTSIZE=2000
    export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] "
    export HISTFILE=$HOME/.bash_history.${TTY_NAME}
    rm -f $HISTFILE

    tail --lines=$(( $HISTFILESIZE + 200 )) ${HOME}/.bash_history_all | sort -u -m -k 4  | tail --lines=$HISTFILESIZE |awk -f ~/.bash.parse_history.awk >> $HISTFILE

    history -r

    if [ -n "$PROMPT_COMMAND" ]; then
        #It is annoying that in PROMPT_COMMAND $HISTCMD is always 1 hence the external script
        export PROMPT_COMMAND="$PROMPT_COMMAND; ${HOME}/.bash_history_all_append.sh \`history 1\`"
    else
        export PROMPT_COMMAND="${HOME}/.bash_history_all_append.sh \`history 1\`"
    fi

    function save_last_command {
        # Only want to do this once per process
        if [ -z "$SAVE_LAST" ]; then
            export SAVE_LAST="done"
            ${HOME}/.bash_history_all_append.sh "`history 1`"
            echo "${TTY_NAME} [`date +'%m-%d-%Y_%T'`] # end session $USER@${HOSTNAME}:`tty`" >> ${HOME}/.bash_history_all
            rm -f $HISTFILE
        fi
    }
    trap 'save_last_command' EXIT

  # END History manipulation section #################################
fi
2.  ${HOME}/.bash.parse_history.awk

#!/usr/bin/awk -f
# Awk script: extract.awk

function extract(str,regexp)
{ RMATCH = (match(str,regexp) ? substr(str,RSTART,RLENGTH) : "")
 #print str " " RSTART " " RLENGTH
 return RSTART }

function after(str,regexp)
{ AMATCH = (match(str,regexp) ? substr(str,RSTART+RLENGTH) : "")
 #print str " " RSTART " " RLENGTH
 return RSTART }


extract($0,"[0-9][0-9]+-[0-9]+-[0-9][0-9]+[_ ][0-9][0-9]:[0-9][0-9]:[0-9][0-9]") {
   gsub(/_/," ", RMATCH)
   TIME = RMATCH
}

after($0,"[0-9][0-9]+-[0-9]+-[0-9][0-9]+[_ ][0-9][0-9]:[0-9][0-9]:[0-9][0-9][] ]+") {
   CMD = AMATCH
}


{
 #printf("TIME=%s,CMD=%s\n",TIME,CMD)
 TRANSDATE = "date --date \"" TIME "\" +%s 2>/dev/null"
 TRANSDATE | getline EPOC
 #printf ("%s\n#%s\n",CMD,EPOC)
 printf ("#%s\n%s\n",EPOC,CMD)
}
3. ${HOME}/.bash_history.sed

s/^\s*[[:digit:]]*\s*//
s/\\/\\\\/g
s/"/\\"/g
s/'/\\'/g
4. ${HOME}/.bash_history_all_append.sh 

#!/usr/bin/env bash

HISTORY_LOG=${HOME}/.bash_history_all

LC=`echo "$*" | sed -f ~/.bash_history.sed | xargs -i -n 1 echo ${TTY_NAME} '{}'`;
if [[ -z `tail -100 ${HISTORY_LOG} | grep -F "$LC" 2>/dev/null` ]] ; then
    echo "${LC}" >> ${HISTORY_LOG}
fi
5. cat ~./bash_history_all即可.

可以看到不同终端的不同命令,当然还有命令执行的时间~nice.

^.^

疑问……









目录
相关文章
|
Linux
Linux 零拷贝splice函数
splice是 Linux 系统中用于在两个文件描述符之间移动数据的系统调用。它的主要作用是在两个文件描述符之间传输数据,而无需在用户空间进行数据拷贝。也是零拷贝操作.
278 0
Linux 零拷贝splice函数
|
前端开发 JavaScript Shell
如何免安装使用 Python?推荐 17 个在线的 Python 解释器!
如何免安装使用 Python?推荐 17 个在线的 Python 解释器!
353 0
|
5月前
|
人工智能 数据可视化 BI
HR必看!用工成本计算居然藏着这些猫腻?手把手教你算准每分钱
用工成本计算远比想象中复杂,隐藏的猫腻让90%的HR新手踩坑。本文从实际案例出发,解析用工成本构成,包括基础项、隐藏项及隐性支出,并揭示三大常见计算雷区。同时,推荐智能系统助力精准核算,通过数字化工具实现成本管控优化,如薪酬结构调整、弹性福利积分制等方法,为企业降本增效。未来,借助先进技术,用工成本管理将更加科学高效。
281 12
|
12月前
|
网络协议 数据库连接 Python
python知识点100篇系列(17)-替换requests的python库httpx
【10月更文挑战第4天】Requests 是基于 Python 开发的 HTTP 库,使用简单,功能强大。然而,随着 Python 3.6 的发布,出现了 Requests 的替代品 —— httpx。httpx 继承了 Requests 的所有特性,并增加了对异步请求的支持,支持 HTTP/1.1 和 HTTP/2,能够发送同步和异步请求,适用于 WSGI 和 ASGI 应用。安装使用 httpx 需要 Python 3.6 及以上版本,异步请求则需要 Python 3.8 及以上。httpx 提供了 Client 和 AsyncClient,分别用于优化同步和异步请求的性能。
374 1
python知识点100篇系列(17)-替换requests的python库httpx
|
12月前
|
负载均衡 算法 数据中心
网络中的链路聚合是什么意思?
【10月更文挑战第12天】
1028 0
网络中的链路聚合是什么意思?
|
搜索推荐 数据挖掘 定位技术
商场定位导航系统:为用户提供的智能化与个性化服务
在现代社会,商场不仅是购物之地,也是休闲社交之所。但庞大的规模常导致顾客迷路,影响体验。商场定位导航系统通过精准室内定位技术,帮助顾客轻松找到目的地,显著提升便捷性与满意度。系统还具备实时位置共享及智能路径规划功能,加强互动营销;同时,数据分析工具助力商场优化管理,提高效率。核心功能包括:高精度电子地图、智能路径规划、实时定位导航、位置共享及基础设施快速查找。这些特性不仅能增加顾客满意度与忠诚度,还能提高商场运营的数据化水平,扩大品牌影响力,是商场智慧化转型的关键。
293 0
商场定位导航系统:为用户提供的智能化与个性化服务
|
Linux 数据处理
Linux中的numfmt命令:数字格式化的强大工具
**numfmt命令在Linux中用于数字格式化,如转换进制、添加千位分隔符、处理字节单位。它支持从文件读取数字并能自定义分隔符、小数位数。例如:`numfmt 12345` 输出12,345(十进制),`numfmt -b 255` 输出11111111(二进制),`numfmt --to=iec 1000000` 输出976.6K(字节单位)。使用时注意选项组合及单位标准。**
|
编解码 Shell Linux
【Shell 命令集合 系统设置 】Linux 调整终端窗口的大小 resize命令 使用指南
【Shell 命令集合 系统设置 】Linux 调整终端窗口的大小 resize命令 使用指南
499 0
|
监控 架构师 项目管理
项目管理架构师的角色与职责:构建高效项目交付框架
【8月更文第7天】在当今快速变化的商业环境中,组织需要灵活高效的项目交付机制来应对不断出现的新挑战。项目管理架构师(Project Management Architect, PMA)作为一种新兴的角色,在确保项目成功交付方面扮演着至关重要的角色。本文将探讨PMA的核心职责,以及他们如何通过设计和实施项目管理流程来提高项目的可扩展性和适应性,并通过有效的项目治理来提升团队的整体表现。
428 0
|
安全 Java 调度
Python创建和结束线程
【7月更文挑战第1天】 - 启动线程:`thread.start()`,等待线程:`thread.join()`。 - 无法直接结束线程,通常通过设置标志位(如全局变量`is_running`)让线程自行退出。 - 使用`Event`对象(`stop_event.is_set()`)提供安全的线程结束方式。 - 异常处理:`try-except`捕获线程中异常,避免意外终止。