quand je stocke la sortie de la commande d’historique via ssh dans un fichier, je reçois quelque chose comme ça
ssh -i private_key user@ip 'export HISTFILE=~/.bash_history; export HISTTIMEFORMAT="%D-%T "; set -o history; history' > myfile.txt
SORTIE
#1337431451 command
autant que possible, cette chaîne de hachage représente un horodatage. comment puis-je changer cela en une chaîne de mon format souhaité
L’historique d’utilisation de PS dans ssh ne génère pas d’horodatage. J’ai essayé presque tout. Donc, je pense que la meilleure chose à faire serait de convertir ces horodatages # à un format de date et heure lisible. Comment puis-je m’y prendre?
Question intéressante: je l’ai essayé mais je n’ai trouvé aucune solution simple et propre pour accéder à l’historique dans un shell non interactif. Cependant, le format du fichier d’historique est simple et vous pouvez écrire un script pour l’parsingr. Le script python suivant pourrait être intéressant. Appelez-le avec 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.comstack(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)
vous pouvez combiner des lignes avec la commande paste:
paste -sd '#\n' .bash_history
et convertir la date avec strftime dans awk:
echo 1461136015 | awk '{print strftime("%d/%m/%y %T",$1)}'
par conséquent, l’historique de bash avec timestamp peut être analysé par la commande suivante:
paste -sd '#\n' .bash_history | awk -F"#" '{d=$2 ; $2="";print NR" "strftime("%d/%m/%y %T",d)" "$0}'
qui convertit:
#1461137765 echo lala #1461137767 echo bebe
à
1 20/04/16 10:36:05 echo lala 2 20/04/16 10:36:07 echo bebe
vous pouvez également créer un script comme / usr / local / bin / fhistory avec un contenu:
#!/bin/bash paste -sd '#\n' $1 | awk -F"#" '{d=$2 ; $2="";print NR" "strftime("%d/%m/%y %T",d)" "$0}'
et parsingr rapidement le fichier historique bash avec la commande suivante:
fhistory .bash_history
En utilisant simplement Awk et d’une manière légèrement plus précise:
awk -F\# '/^#1[0-9]{9}$/ { if(cmd) printf "%5d %s %s\n",n,ts,cmd; ts=strftime("%F %T",$2); cmd=""; n++ } !/^#1[0-9]{9}$/ { if(cmd)cmd=cmd " " $0; else cmd=$0 }' .bash_history
Ceci parsing uniquement les lignes commençant par quelque chose qui ressemble à un horodatage ( /^#1[0-9]{9}$/
), comstack toutes les lignes suivantes jusqu’au prochain horodatage, combine les commandes multi-lignes avec " "
(1 espace ) et imprime les commandes dans un format similaire à l’ history
y compris une numérotation.
Notez que la numérotation ne correspond pas (nécessairement) s’il y a des commandes multi-lignes.
Sans la numérotation et la séparation des commandes multilignes avec une nouvelle ligne:
awk -F\# '/^#1[0-9]{9}$/ { if(cmd) printf "%s %s\n",ts,cmd; ts=strftime("%F %T",$2); cmd="" } !/^#1[0-9]{9}$/ { if(cmd)cmd=cmd "\n" $0; else cmd=$0 }' .bash_history
Enfin, une solution rapide et sale utilisant GNU Awk (gawk) pour sortinger également la liste:
gawk -F\# -v histtimeformat="$HISTTIMEFORMAT" ' /^#1[0-9]{9}$/ { i=$2 FS NR; cmd[i]="" } !/^#1[0-9]{9}$/ { if(cmd[i]) cmd[i]=cmd[i] "\n" $0; else cmd[i]=$0 } END { PROCINFO["sorted_in"] = "@ind_str_asc" for (i in cmd) { split(i,arr) print strftime(histtimeformat,arr[1]) cmd[i] } }'