Kravet er at registrere kommandolinjeshistorik i en fil med specifik dato og klokkeslæt for kommandoer, når de blev udført.
Nedenstående script registrerer historik med dato og tid, men det tildeler også den aktuelle dato og tid for ældre kommandoer. Jeg vil også udvide scriptet til at tage trinvis sikkerhedskopi af historikudgangsfilen.
#!/bin/bash . ~/.bash_profile HISTFILE=~/.bash_history set -o history history >/home/user/hist_`date "+%d%b%y%T"`
Kommentarer
- Brug ikke ' til at bruge shellhistorik til dette. Brug regnskab eller sudo (og log sudo-kommandoer).
- Sådan bruges regnskab eller sudo til historikfangst i en fil
- sudo kan konfigureres til at registrere dens historie (og endda tty output ) i en fil (eller via syslog). Hvad mener du med " regnskab "?
- @SunLynx, se Hvordan kan du logge alle indtastede kommandoer
Svar
Ikke helt hvad du ønsket, men du kan få bash
til automatisk at føje tidsstempler til hver linje i historikken. Indstil blot for dit eksempel:
HISTTIMEFORMAT="%d%b%y%T "
history
-kommandoen uden argumenter viser derefter dine historikposter som denne:
23Jul1515:48:14 ls -ld .
history -w
-kommandoen skriver dog altid historiefilen i det interne format af:
#1437659315 ls -ld .
dvs. på 2 linjer holder den første linje tiden i sekunder “siden epoken” (dvs. 1. januar 1970) med en #
foran, så den ikke forveksles med en kommando.
Kommentarer
- Jeg ønsker at indfange historik på daglig basis, oven over script fungerer, men det tildeler den aktuelle dato til alle kommandoer. Også efter hver kommando genereres et nummer, som jeg ikke ' ikke vil have. Hvis nogen kan hjælpe, vil det være virkelig nyttigt
- Jeg ved ikke hvad du mener med " et nummer genererer ". Kan du redigere dit originale spørgsmål med et eksempel på, hvilke filer du vil hente og deres indhold?
- 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 disse meddelelser genererer
- det er svært at læse dette i en kommentar. fjern dine kommentarer og rediger spørgsmålet du oprindeligt skrev, tak.
Svar
I bash er der en mulighed, der instruerer bash om at optage et tidsstempel med hver kommando. Du gør dette ved at tildele en miljøvenlig værdi HISTTIMEFORMAT
en nyttig værdi. Fra bash
manpage:
Hvis denne variabel er indstillet og ikke nul, bruges dens værdi som en formatstreng til
strftime(3)
for at udskrive det tidsstempel, der er knyttet til hver historieindgang, der vises af den indbyggede historie. Hvis denne variabel er indstillet, skrives tidsstempler til historikfilen, så de kan bevares på tværs af shell-sessioner. Dette bruger historikkommentartegnet til at skelne tidsstempler fra andre historiklinjer.
I mit miljø bruger jeg
HISTTIMEFORMAT="%s (%H:%M:%S):"
Så at kommandoerne let kan sorteres (%s
er tidsstempel i sekunder) og kan læses af mennesker. Når jeg skriver history
i min skal, ser jeg noget som følger:
3 1437664568 (17:16:08):man bash 4 1437664699 (17:18:19):history
EDIT: OPs spørgsmål ikke fuldt ud besvaret.
Jeg vil også udvide scriptet til at tage trinvis sikkerhedskopi af historikudgangsfilen
Jeg er ikke sikker på, hvad du mener med “trinvis sikkerhedskopiering” af historikfilen. Måske vil du blot have en sikkerhedskopi af historikken med jævne mellemrum. Der er et par fremgangsmåder, du kan tage:
- Indstil variablen PROMPT_COMMAND med
history -a
for løbende at opdatere historik-kommandoen efter hver påkaldelse (i modsætning til at vente på logout). - Fæld DEBUG signal med en funktion, du definerer. Hver gang en kommando indtastes, kaldes funktionen. Fra funktionen kan du gøre alt. (Lidt mere pålidelig end PROMPT_COMMAND).
- cronjob til periodisk at kopiere / arkivere historikfilen.
Kommentarer
- Tak for forslag, men jeg har ' testet ovenfor. Kan du venligst uddybe mere om historie -a. Shell-script fungerer fint, men forkert tidsstempler.Dette er det ene problem, og et andet er et nummer efter hver kommando, der starter med #. til f.eks. # 1435987168.
-
#1435987168
i historikfilen er tidsstemplet ! Der er et par måder at konvertere det til brugervenligt format, herunder: indlæs historikfilen i bash medhistory -n _filename_
og derefterhistory
. Eller du kan gøre noget som dette:perl -lane '{ /^#(\d+)$/&&print "#".localtime($1) or print;}' $HISTFILE
for at få vist historikken med tidsstemplerne. Så det ' er sandsynligvis, at tidsstemplerne er korrekte, men du har et landestandard- eller tidszone-problem? - Uddyber
history -a
?? Mandsiden er lidt vildledende. Det føjer den aktuelle sessionshistorik til den fil, der er udpeget af $ HISTFILE. Efterfølgende opkald tilføjer historikken, der er genereret siden den sidste påkaldelse (den ' t overskriver hele filen igen og igen)