De vereiste is om de geschiedenis van de opdrachtregel vast te leggen in een bestand met een specifieke datum en tijd van opdrachten, wanneer ze werden uitgevoerd.

Het onderstaande script legt de geschiedenis vast met datum en tijd, maar wijst ook de huidige datum en tijd toe aan oudere opdrachten. Ook wil ik het script uitbreiden om een incrementele back-up te maken van het geschiedenisuitvoerbestand.

#!/bin/bash . ~/.bash_profile HISTFILE=~/.bash_history set -o history history >/home/user/hist_`date "+%d%b%y%T"` 

Reacties

  • Gebruik hiervoor geen ‘ shell-geschiedenis. Gebruik accounting of sudo (en log sudo-opdrachten).
  • Hoe accounting of sudo te gebruiken voor het vastleggen van geschiedenis in een bestand
  • sudo kan worden geconfigureerd om de geschiedenis vast te leggen (en zelfs de uitvoer ) in een bestand (of via syslog). Wat bedoel je met ” boekhouding “?
  • @SunLynx, zie Hoe kun je elk getypt commando loggen

Antwoord

Niet helemaal wat je hebt gezocht, maar je kunt bash krijgen om automatisch tijdstempels toe te voegen aan elke regel in de geschiedenis. Stel eenvoudigweg, voor uw voorbeeld:

HISTTIMEFORMAT="%d%b%y%T " 

Het history commando zonder argumenten zal uw geschiedenisitems als volgt weergeven:

23Jul1515:48:14 ls -ld . 

De history -w commando schrijft echter altijd het geschiedenisbestand in het interne formaat van:

#1437659315 ls -ld . 

dwz op 2 regels bevat de eerste regel de tijd in seconden “since the epoch” (dwz 1 jan 1970) met een # ervoor zodat het niet wordt verward met een commando.

Reacties

  • Ik wil de geschiedenis dagelijks vastleggen, bovenstaande script werkt maar het wijst de huidige datum toe aan alle commandos. Ook wordt na elk commando een nummer gegenereerd, dat ik niet ‘ niet wil. Als iemand kan helpen, zal dat echt nuttig zijn.
  • Ik weet niet wat je bedoelt met ” een getal genereert “. Kunt u uw oorspronkelijke vraag bewerken met een voorbeeld van welke bestanden u wilt krijgen, en hun inhoud?
  • 598 05Jul15 00: 00: 01less .bash_history 599 05Jul15 00: 00: 01 # 1435987168600 05Jul15 00: 00: 01man rsync 601 05jul15 00: 00: 01 # 1435988263 602 05jul15 00: 00: 01ls -lrt / srv / cloud- * 603 05jul15 00: 00: 01 # 1435988281604 05jul15 00: 00: 01crontab -l 605 05jul15 00: 00: 01 # 1435988290 606 05Jul15 00: 00: 01cat /srv/cloud-user_hist.sh
  • zoals dit bericht genereert
  • het is moeilijk om dit in een opmerking te lezen. verwijder uw opmerkingen en bewerk de vraag die u oorspronkelijk schreef, alstublieft.

Antwoord

In bash is er een optie die bash de opdracht geeft om bij elk commando een tijdstempel op te nemen. U doet dit door een nuttige waarde toe te wijzen aan de omgevingsvariabele HISTTIMEFORMAT. Van de bash manpage:

Als deze variabele is ingesteld en niet null, wordt de waarde ervan gebruikt als een format string voor strftime(3) om het tijdstempel af te drukken dat is gekoppeld aan elk geschiedenisitem dat wordt weergegeven door de ingebouwde geschiedenis. Als deze variabele is ingesteld, worden tijdstempels naar het geschiedenisbestand geschreven, zodat ze in shell-sessies kunnen worden bewaard. Dit gebruikt het geschiedeniscommentaar-teken om tijdstempels te onderscheiden van andere geschiedenisregels.

In mijn omgeving gebruik ik

HISTTIMEFORMAT="%s (%H:%M:%S):" 

Zodat de commandos gemakkelijk kunnen worden gesorteerd (%s is tijdstempel in seconden) en leesbaar voor mensen. In mijn shell, wanneer ik history typ, zie ik zoiets als het volgende:

3 1437664568 (17:16:08):man bash 4 1437664699 (17:18:19):history 

EDIT: OPs-vraag niet volledig beantwoord.

Ik wil ook het script uitbreiden om een incrementele back-up te maken van het geschiedenisuitvoerbestand

Ik “weet niet zeker wat u bedoelt met” incrementele back-up “van het geschiedenisbestand. Misschien wilt u gewoon periodiek een back-up van de geschiedenis maken. Er zijn een aantal manieren die u kunt volgen:

  • Stel de PROMPT_COMMAND-variabele in met history -a om het history-commando continu bij te werken na elke aanroep (in plaats van te wachten op uitloggen).
  • Trap de DEBUG signaal met een functie die je definieert. Elke keer dat een commando wordt ingevoerd, wordt de functie aangeroepen. Vanuit de functie kun je alles doen. (Iets betrouwbaarder dan PROMPT_COMMAND).
  • cronjob om periodiek te kopiëren / archiveren het geschiedenisbestand.

Reacties

  • Bedankt voor suggesties, maar ik heb het ‘ hierboven getest. Kunt u alstublieft meer vertellen over de geschiedenis -a. Shell-script werkt prima, maar verkeerde tijdstempels.Dit is het ene probleem en het andere is een nummer na elk commando dat begint met #. voor b.v. # 1435987168.
  • De #1435987168 in het geschiedenisbestand is het tijdstempel ! Er zijn een aantal manieren om dat naar een gebruiksvriendelijk formaat te converteren, waaronder: laad het geschiedenisbestand in bash met history -n _filename_ en vervolgens history . Of je kunt zoiets als dit doen: perl -lane '{ /^#(\d+)$/&&print "#".localtime($1) or print;}' $HISTFILE om de geschiedenis met de tijdstempels weer te geven. Dus ‘ is waarschijnlijk dat de tijdstempels correct zijn, maar je hebt een probleem met de locale of tijdzone?
  • Uitwerken op history -a ?? De man-pagina is een beetje misleidend. Het voegt de huidige sessiegeschiedenis toe aan het bestand dat is aangeduid met $ HISTFILE. Volgende oproepen zullen de geschiedenis toevoegen die is gegenereerd sinds de laatste aanroep (het ‘ overschrijft het hele bestand niet steeds opnieuw)

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *