Kravet är att fånga kommandoradshistorik i en fil med specifikt datum och tid för kommandon när de kördes.
Nedanstående skript registrerar historik med datum och tid men det tilldelar också aktuellt datum och tid för äldre kommandon. Jag vill också utöka skriptet för att ta stegvis backup av historikens utdatafil.
#!/bin/bash . ~/.bash_profile HISTFILE=~/.bash_history set -o history history >/home/user/hist_`date "+%d%b%y%T"`
Kommentarer
- Använd inte ' för att använda skalhistorik för detta. Använd redovisning eller sudo (och logga sudo-kommandon).
- Hur man använder redovisning eller sudo för historikhämtning i en fil
- sudo kan konfigureras för att fånga dess historik (och till och med tty-utdata ) i en fil (eller via syslog). Vad menar du med " redovisning "?
- @SunLynx, se Hur kan du logga alla kommandon som skrivs
Svar
Inte riktigt vad du ville, men du kan få bash
att automatiskt lägga till tidsstämplar till varje rad i historiken. Ange bara för ditt exempel:
HISTTIMEFORMAT="%d%b%y%T "
history
-kommandot utan argument visar sedan dina historikposter så här:
23Jul1515:48:14 ls -ld .
history -w
-kommandot skriver dock alltid historikfilen i det interna formatet av:
#1437659315 ls -ld .
dvs. på två rader håller den första raden tiden i sekunder ”sedan epoken” (dvs. 1 jan 1970) med en #
framför så att den inte kommer att förväxlas med ett kommando.
Kommentarer
- Jag vill fånga historik dagligen, ovanför skript fungerar men det tilldelar aktuellt datum till alla kommandon. Också efter varje kommando genereras ett nummer som jag inte vill '. Om någon kan hjälpa kommer det att vara till stor hjälp
- Jag vet inte vad du menar med " ett nummer genererar ". Kan du redigera din ursprungliga fråga med ett exempel på vilka filer du vill få och deras innehåll?
- 598 05Jul15 00: 00: 01less .bash_history 599 05Jul15 00: 00: 01 # 1435987168 600 05Jul15 00: 00: 01man rsync 601 05Jul15 00: 00: 01 # 1435988263 602 05Jul15 00: 00: 01ls -lrt / srv / cloud- * 603 05Jul15 00: 00: 01 # 1435988281 604 05Jul15 00: 01: 01crontab -l 605 05Jul15 00: 00: 01 # 1435988290 606 05Jul15 00: 00: 01cat /srv/cloud-user_hist.sh
- som det här meddelandet genererar
- det är svårt att läsa detta i en kommentar. ta bort dina kommentarer och redigera frågan du ursprungligen skrev, snälla.
Svara
I bash finns det ett alternativ som instruerar bash att spela in en tidsstämpel med varje kommando. Du gör detta genom att tilldela ett användbart värde till miljövariabeln HISTTIMEFORMAT
. Från bash
manpage:
Om denna variabel är inställd och inte null används dess värde som formatsträng för
strftime(3)
för att skriva ut den tidsstämpel som är associerad med varje historikpost som visas av den inbyggda historiken. Om den här variabeln är inställd skrivs tidsstämplar till historikfilen så att de kan bevaras över skal-sessioner. Detta använder historik kommentar för att skilja tidsstämplar från andra historik rader.
I min miljö använder jag
HISTTIMEFORMAT="%s (%H:%M:%S):"
Så att kommandona enkelt kan sorteras (%s
är tidsstämpel på några sekunder) och läsbar för människor. När jag skriver history
i mitt skal ser jag något liknande:
3 1437664568 (17:16:08):man bash 4 1437664699 (17:18:19):history
EDIT: OPs-fråga inte helt besvarat.
Jag vill också utöka skriptet för att ta stegvis backup av historikens utdatafil
Jag är inte säker på vad du menar med ”inkrementell säkerhetskopiering” av historikfilen. Kanske vill du helt enkelt säkerhetskopiera historiken med jämna mellanrum. Det finns ett par metoder du kan ta:
- Ställ in PROMPT_COMMAND-variabeln med
history -a
för att kontinuerligt uppdatera kommandot historik efter varje anrop (i motsats till att vänta på utloggning). - Fånga DEBUG signal med en funktion du definierar. Varje gång ett kommando matas in kommer funktionen att anropas. Inifrån funktionen kan du göra allt. (Något mer tillförlitlig än PROMPT_COMMAND).
- cronjob för att regelbundet kopiera / arkivera historikfilen.
Kommentarer
- Tack för förslag men jag ' har testat ovan. Kan du snälla utarbeta mer om historia -a. Shell-skript fungerar bra men fel tidsstämplar.Detta är det ena problemet och ett annat är ett nummer efter varje kommando som börjar med #. för t.ex. # 1435987168.
-
#1435987168
i historikfilen är tidsstämpeln ! Det finns ett par sätt att konvertera det till användarvänligt format, inklusive: ladda historikfilen till bash medhistory -n _filename_
och sedanhistory
. Eller så kan du göra något så här:perl -lane '{ /^#(\d+)$/&&print "#".localtime($1) or print;}' $HISTFILE
för att visa historiken med tidsstämplarna. Så det är ' förmodligen att tidsstämplarna är korrekta, men du har ett språk- eller tidszonproblem? - Utarbeta
history -a
?? Man-sidan är lite vilseledande. Den lägger till den aktuella sessionshistoriken till filen som anges av $ HISTFILE. Efterföljande samtal kommer att lägga till historiken som genererats sedan den senaste anropet (det skrivs inte ' t hela filen om och om igen)