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转换为可读的日期时间格式.我该怎么做呢?
您可以使用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)
有趣的问题:我已经尝试过,但没有找到简单干净的解决方案来访问非交互式 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)