339 votes

Comment voir les horodatages dans l'historique de bash ?

Y a-t-il un moyen de voir à quelle heure les commandes ont été exécutées à partir de l'historique bash ? Nous pouvons voir l'ordre mais y a-t-il un moyen d'obtenir également l'heure ?

Ligne de fond : Temps d'exécution dans l'historique du Bash

2voto

Nam G VU Points 1938

Ma version qui fonctionne

HISTTIMEFORMAT="%F %T %z " history | grep 'your command'

réf. https://www.linuxuprising.com/2019/07/bash-history-how-to-show-timestamp-when.html

Par exemple

you@your-server:/some/path 
$ HISTTIMEFORMAT="%F %T %z "; history | grep 'some command'
 1947  2019-12-17 15:54:34 +0800 ./some.sh
 1948  2019-12-17 15:54:34 +0800 ./my-command

Voir la syntaxe complète pour HISTTIMEFORMAT aquí

1voto

iii Points 135

Pour activer les horodateurs de l'historique pour tous les utilisateurs, créez un script dans /etc/profile.d :

echo 'HISTTIMEFORMAT="%Y%m%d %T "' >> /etc/profile.d/timestamp.sh

0voto

Shashank Agrawal Points 109

Je sais, je réponds très tard, mais pour faire cela pour tous les utilisateurs, vous pouvez créer n'importe quelle .sh dans /etc/profile.d et ajoutez-y la ligne suivante :

echo 'HISTTIMEFORMAT="%Y-%m-%d %T "' >> /etc/profile.d/existing-foo-file.sh

Si vous n'êtes pas connecté en tant que root ou superutilisateur, vous devez utiliser l'option tee pour ce faire :

echo 'HISTTIMEFORMAT="%Y-%m-%d %T "' | sudo tee /etc/profile.d/mytimestamp.sh

Si vous voulez ajouter à un fichier existant, passez la commande -a pour tee comando:

echo 'HISTTIMEFORMAT="%Y-%m-%d %T "' | sudo tee -a /etc/profile.d/mytimestamp.sh

enter image description here

0voto

colin Points 1

Je maintiens un historique par périphérique tty et par utilisateur, dans .bash_profile, et je les laisse se développer. Parfois, je veux trouver où une commande a été utilisée dans tous ces fichiers en utilisant grep, par exemple. Je viens de passer un moment à obtenir ce que je veux, avec des horodatages sous forme de chaînes et d'en-têtes pour chaque fichier, plus le tty avant l'heure, de sorte que si je fais un grep, je verrai où et quand il a été utilisé :

$ awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ((ln==0) && ($1 ~/^[0-9]+$/)){Cmd="date -r "$1""; Cmd | getline textDate; close(Cmd);baseD=substr(textDate,1,length(textDate)-5);baseS=$1}; if ($1 ~/^[0-9]+$/){printf "%s %s+%.2fH (%d)%s\n",  tty, baseD, ($1-baseS)/3600, $1, $2; if (ln==0) {ln=20} else {ln--}}} ' .bash_history_ttys003|head

==>.bash_history_ttys003<==
ttys003 Thu 28 Sep 2017 10:45:48+0.00H (1506591948)cp Qlog t
ttys003 Thu 28 Sep 2017 10:45:48+6.12H (1506613974)grep \ 755\  Qlog
ttys003 Thu 28 Sep 2017 10:45:48+6.15H (1506614092)grep \ 769\  Qlog
ttys003 Thu 28 Sep 2017 10:45:48+6.16H (1506614130)locate akd
ttys003 Thu 28 Sep 2017 10:45:48+6.17H (1506614159)less /System/Library/LaunchAgents/com.apple.akd.plist
ttys003 Thu 28 Sep 2017 10:45:48+6.17H (1506614172)mN -K PLIST
ttys003 Thu 28 Sep 2017 10:45:48+6.18H (1506614179)man -k plist
ttys003 Thu 28 Sep 2017 10:45:48+6.18H (1506614213)man swapllist

Je ne peux pas m'étendre sur le contexte car la vie est trop courte (LITS) mais voici mes notes de développement au fur et à mesure que j'ai travaillé dessus. C'est sur macOS, donc pas de gawk spécial, mais j'utilise date -r là où ça peut être différent pour vous, date -d ? Bonne lecture ! :

How would I list all .bash_history* lines that grep finds together with the Unix timestamp as string?
sample data lines in history (#unix time \n command)
head .bash_history_ttys007
\#1502956374
man top
\#1502956600
top

As 2 lines looks like an awk task...
Can't print FILENAME in begin as there is no current file at that stage :( so use FNR file rec numb check...
awk 'BEGIN{RS="#"} {if (FNR == 1){ print FILENAME }; "date -r "$1"" | getline textDate; close(date);print textDate, $0}'
awk 'BEGIN{RS="#"} {if (FNR == 1){ print FILENAME }; "date -r "$1"" | getline textDate; close(date);print textDate, $0}' .bash_history_ttys00[67]|head
Works but 3 lines per item as x0a line-returns are in there. WILL HAVE OTHER PROBLEMS TOO (later)...
Progress by field sep on new lines and carve up filename for controlling terminal
awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ($1 ~/^[0-9]+$/){"date -r "$1"" | getline textDate; close(date);print  tty, substr(textDate,1,length(textDate)-1) ,"(" $1")", $2} }' .bash_history_ttys00[67]|head

$ awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ($1 ~/^[0-9]+$/){"date -r "$1"" | getline textDate; close(date -r "$1");print  tty, substr(textDate,1,length(textDate)-1) ,"(" $1")", $2} }' .bash_history_ttys002

Works OK but runs a bit slow: just do dates every once in a while? then if grep-ing will probably miss it...
awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ($1 ~/^[0-9]+$/){Cmd="date -r "$1""; Cmd | getline textDate; close(Cmd);print  tty, substr(textDate,1,length(textDate)-1) ,"(" $1")", $2} }' .bash_history_ttys002

Do occasional date convert and retain string and offset secs? this does run much faster and requires timestamps to avoid # in commands. About 5s for 20,000 commands for me.
awk 'BEGIN{RS="#"; FS="\n"} {if (FNR == 1){ print "\n==>" FILENAME "<=="; tty=substr(FILENAME,15,9) }; if ((ln==0) && ($1 ~/^[0-9]+$/)){Cmd="date -r "$1""; Cmd | getline textDate; close(Cmd);baseD=substr(textDate,1,length(textDate)-5);baseS=$1}; if ($1 ~/^[0-9]+$/){printf "%s %s+%.2fH (%d)%s\n",  tty, baseD, ($1-baseS)/3600, $1, $2; if (ln==0) {ln=20} else {ln--}}} ' .bash_history_ttys003

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X