La condition est de capturer lhistorique de la ligne de commande dans un fichier avec la date et lheure spécifiques des commandes, quand elles ont été exécutées.
Le script ci-dessous capture lhistorique avec la date et lheure mais il attribue également la date et lheure actuelles pour les commandes plus anciennes. Je souhaite également étendre le script pour effectuer une sauvegarde incrémentielle du fichier de sortie de lhistorique.
#!/bin/bash . ~/.bash_profile HISTFILE=~/.bash_history set -o history history >/home/user/hist_`date "+%d%b%y%T"`
Commentaires
- Nutilisez pas ‘ lhistorique du shell pour cela. Utilisez la comptabilité ou sudo (et connectez les commandes sudo).
- Comment utiliser la comptabilité ou sudo pour la capture dhistorique dans un fichier
- sudo peut être configuré pour capturer son historique (et même la sortie tty ) dans un fichier (ou via syslog). Quentendez-vous par » comptabilité « ?
- @SunLynx, voir Comment enregistrer chaque commande saisie
Réponse
Pas tout à fait ce que vous souhaité, mais vous pouvez obtenir bash
pour ajouter automatiquement des horodatages à chaque ligne de lhistorique. Définissez simplement, pour votre exemple:
HISTTIMEFORMAT="%d%b%y%T "
La commande history
sans argument affichera alors vos entrées dhistorique comme ceci:
23Jul1515:48:14 ls -ld .
Le history -w
écrit cependant toujours le fichier dhistorique au format interne de:
#1437659315 ls -ld .
ie sur 2 lignes, la première ligne contient le temps en secondes « depuis lépoque » (ie 1er janvier 1970) avec un #
devant pour ne pas être confondu avec une commande.
Commentaires
- Je veux capturer lhistorique quotidiennement, le script ci-dessus fonctionne mais il attribue la date actuelle à toutes les commandes. De plus, après chaque commande, un numéro est généré, ce que je ne veux pas ‘. Si quelquun peut aider, cela sera vraiment utile
- Je ne sais pas ce que vous entendez par » un nombre génère « . Pourriez-vous modifier votre question initiale avec un exemple des fichiers que vous souhaitez obtenir et de leur contenu?
- 598 05Jul15 00: 00: 01less .bash_history 599 05Jul15 00: 00: 01 # 1435987168 600 05Jul15 00: 00: 01man rsync 601 05Jul15 00: 00: 01 # 1435988263602 05Jul15 00: 00: 01ls -lrt / srv / cloud- * 603 05Jul15 00: 00: 01 # 1435988281 604 05Jul15 00: 00: 01crontab -l 605 05Jul15 00: 00: 01 # 1435988290 606 05Jul15 00: 00: 01cat /srv/cloud-user_hist.sh
- comme ce message génère
- il est difficile de lire ceci dans un commentaire. supprimez vos commentaires et modifiez la question que vous avez initialement rédigée, sil vous plaît.
Réponse
Dans bash, il existe une option qui demande à bash denregistrer un horodatage avec chaque commande. Pour ce faire, attribuez une valeur utile à la variable denvironnement HISTTIMEFORMAT
. Depuis la page de manuel bash
:
Si cette variable est définie et non nulle, sa valeur est utilisée comme chaîne de format pour
strftime(3)
pour imprimer lhorodatage associé à chaque entrée dhistorique affichée par lhistorique intégré. Si cette variable est définie, les horodatages sont écrits dans le fichier dhistorique afin quils puissent être conservés à travers les sessions shell. Cela utilise le caractère de commentaire dhistorique pour distinguer les horodatages des autres lignes dhistorique.
Dans mon environnement, jutilise
HISTTIMEFORMAT="%s (%H:%M:%S):"
Pour que les commandes puissent être triées facilement (%s
est lhorodatage en secondes) et lisibles par lhomme. Dans mon shell, lorsque je tape history
, je vois quelque chose comme ce qui suit:
3 1437664568 (17:16:08):man bash 4 1437664699 (17:18:19):history
EDIT: OPs question pas entièrement répondu.
Je souhaite également étendre le script pour effectuer une sauvegarde incrémentielle du fichier de sortie de lhistorique
Je ne sais pas ce que vous entendez par «sauvegarde incrémentielle» du fichier d’historique. Peut-être voulez-vous simplement que l’historique soit sauvegardé périodiquement. Il existe plusieurs approches que vous pouvez adopter:
- Définissez la variable PROMPT_COMMAND avec
history -a
pour mettre continuellement à jour la commande dhistorique après chaque appel (par opposition à lattente de la déconnexion). - Intercepter le DEBUG signal avec une fonction que vous définissez. Chaque fois quune commande est entrée, la fonction sera appelée. À partir de la fonction, vous pouvez tout faire. (Légèrement plus fiable que PROMPT_COMMAND).
- cronjob pour copier / archiver périodiquement le fichier dhistorique.
Commentaires
- Merci pour vos suggestions, mais jai ‘ testé ci-dessus. Pouvez-vous sil vous plaît élaborer plus sur lhistoire -a. Le script Shell fonctionne correctement mais les horodatages sont incorrects.Cest le seul problème et un autre est un nombre après chaque commande commençant par #. par exemple # 1435987168.
- Le
#1435987168
dans le fichier historique est lhorodatage ! Il existe plusieurs façons de le convertir en un format convivial, notamment: charger le fichier dhistorique dans bash avechistory -n _filename_
puishistory
. Ou vous pouvez faire quelque chose comme ceci:perl -lane '{ /^#(\d+)$/&&print "#".localtime($1) or print;}' $HISTFILE
pour afficher lhistorique avec les horodatages. Donc, ‘ est probablement que les horodatages sont corrects, mais vous avez un problème de paramètres régionaux ou de fuseau horaire? - Élaborez sur
history -a
?? La page de manuel est un peu trompeuse. Il ajoute lhistorique de session en cours au fichier désigné par $ HISTFILE. Les appels suivants ajouteront lhistorique généré depuis le dernier appel (cela ne remplace pas ‘ tout le fichier encore et encore)