将历史文件中的哈希标记时间戳转换为所需的字符串

use*_*163 7 unix ssh bash history time-format

当我通过ssh将历史命令的输出存储在一个文件中时,我得到类似的东西

ssh -i private_key user@ip 'export HISTFILE=~/.bash_history; export HISTTIMEFORMAT="%D-%T "; set -o history; history' > myfile.txt
Run Code Online (Sandbox Code Playgroud)

OUTPUT

#1337431451
command
Run Code Online (Sandbox Code Playgroud)

据我所知,这个哈希字符串代表一个时间戳.如何将其更改为我想要的格式的字符串

PS-在ssh中使用历史记录不会输出时间戳.几乎尝试了一切.所以我想下一个要做的最好的事情就是将这些#timestamps转换为可读的日期时间格式.我该怎么做呢?

tmf*_*zkv 6

您可以使用paste命令组合行:

paste -sd '#\n' .bash_history
Run Code Online (Sandbox Code Playgroud)

并在awk中使用strftime转换日期:

echo 1461136015 | awk '{print strftime("%d/%m/%y %T",$1)}'
Run Code Online (Sandbox Code Playgroud)

因此,带有时间戳的bash历史记录可以通过下一个命令进行解析:

paste -sd '#\n' .bash_history | awk -F"#" '{d=$2 ; $2="";print NR" "strftime("%d/%m/%y %T",d)" "$0}'
Run Code Online (Sandbox Code Playgroud)

转换:

#1461137765
echo lala
#1461137767
echo bebe
Run Code Online (Sandbox Code Playgroud)

1 20/04/16 10:36:05   echo lala
2 20/04/16 10:36:07   echo bebe
Run Code Online (Sandbox Code Playgroud)

您也可以使用内容创建/ usr/local/bin/fhistory等脚本:

#!/bin/bash

paste -sd '#\n' $1 | awk -F"#" '{d=$2 ; $2="";print NR" "strftime("%d/%m/%y %T",d)" "$0}'
Run Code Online (Sandbox Code Playgroud)

并使用下一个命令快速解析bash历史文件:

fhistory .bash_history
Run Code Online (Sandbox Code Playgroud)


nos*_*sid 4

有趣的问题:我已经尝试过,但没有找到简单干净的解决方案来访问非交互式 shell 中的历史记录。不过历史文件的格式很简单,你可以编写一个脚本来解析它。下面的 python 脚本可能会很有趣。使用以下命令调用它ssh -i private_key user@ip 'path/to/script.py .bash_history'

#! /usr/bin/env python3

import re
import sys
import time

if __name__ == '__main__':
    pattern = re.compile(br'^#(\d+)$')
    out = sys.stdout.buffer
    for pathname in sys.argv[1:]:
        with open(pathname, 'rb') as f:
            for line in f:
                timestamp = 0
                while line.startswith(b'#'):
                    match = pattern.match(line)
                    if match: timestamp, = map(int, match.groups())
                    line = next(f)
                out.write(time.strftime('%F %T ', time.localtime(timestamp)).encode('ascii'))
                out.write(line)
Run Code Online (Sandbox Code Playgroud)