不同session的history操作同步问题-阿里云开发者社区

开发者社区> lin.tao> 正文

不同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.

^.^

疑问……









版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【操作系统】2、进程管理与死锁
1、进程 所谓进程,可以认为是一个程序及其正在运行的过程。相对来说,程序是一个静态的概念,而进程是一个动态的概念,更加强调程序运行的过程和状态。一般一个进程至少要包含几个内容,即程序代码、程序处理的数据、CPU寄存器的值、堆和栈以及进程所占用的系统资源。
822 0
"云操作系统"和普通操作系统有啥不同
本文讲的是"云操作系统"和普通操作系统有啥不同, 这让人想起了IBM最初在业界宣扬云计算概念的时候,提出了“蓝云计算”的产品系列,不过,IBM的那个产品系列是帮助用户构筑企业云计算环境,着力点还是在硬件基础设施和相关的资源管理。
1960 0
Visual Studio 2010 起始页中 不显示最近使用的项目问题,解决办法
最近新装了vs2010,发现打开vs2010 后 起始页面中的最近使用的栏目中 并未显示最近加载的项目 解决办法如下: 运行 regedit 打开下面的键值: HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Policie...
486 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
11814 0
Haskell函数式编程之四-List操作
List在函数式语言中是一个重要的抽象,很多事情离了它就很难做到。函数式语言的鼻祖Lisp名称就来自List processing。 Haskell本身也给List操作提供了一系列的操作符以及库函数。
738 0
Microsoft Visual Studio与Firefly 一直提示加载项目,更新源码状态问题
        笔记本一开始安装的是vs2010,由于近期开发要用vs2008与vs2005于是今天又把2008、2005安装上了,但在打开项目的时候,先是提示加载项目文件,然后一直提示更新源码状态,很慢很慢的,之前只有vs2010的时候,打开是很快的,现在不管是用2008、2005、2010就没有一个快的,源码管理用的是firefly,有人知道为什么会出现这种情况吗?        
1003 0
操作高速通道 配置健康检查,只需四步!
阿里云每两秒从健康检查IP地址向本地数据中心中的客户侧互联IP发送一个ping报文,如果某条物理专线上连续8个ping报文都无法得到回复,则将流量切换至另一条链路。
575 0
Total Commander之添加两边同时进行文件夹切换操作
Total Commander最方便之处在于两列文件管理视窗,这样复制备份文件就很方便,但有的时候想人工查看两个具有相同目录结构的文件夹时,比如和FTP上的文件夹对比。如果先切换左边的目录,再切换右边的目录,文件夹多了就很繁琐,很麻烦。 可以这样做,先在工具栏新建一个按钮,然后选择按钮的“命令”为“cm_SyncChangeDir”,描述为“两边窗口同步移到上层文件夹”,序号”2600″
1388 0
+关注
lin.tao
无他,唯手熟尔
346
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载