Kravet er å fange kommandolinjelogg i en fil med spesifikk dato og klokkeslett for kommandoer, da de ble utført.
Skriptet nedenfor viser historikken med dato og klokkeslett, men det tildeler også gjeldende dato og klokkeslett for eldre kommandoer. Jeg vil også utvide skriptet for å ta inkrementell sikkerhetskopi av historikkutdatafilen.
#!/bin/bash . ~/.bash_profile HISTFILE=~/.bash_history set -o history history >/home/user/hist_`date "+%d%b%y%T"`
Kommentarer
- Ikke bruk ' Ikke bruk skallhistorikk til dette. Bruk regnskap eller sudo (og logg sudo-kommandoer).
- Hvordan bruke regnskap eller sudo for historikkfangst i en fil
- sudo kan konfigureres til å registrere historikken (og til og med tty-utdata ) inn i en fil (eller via syslog). Hva mener du med " regnskap "?
- @SunLynx, se Hvordan kan du logge alle typte kommandoer
Svar
Ikke helt hva du ønsket, men du kan få bash
til å legge til tidsstempler til hver linje i historikken automatisk. Bare sett for eksempel:
HISTTIMEFORMAT="%d%b%y%T "
history
-kommandoen uten argumenter vil da vise historikkoppføringene dine slik:
23Jul1515:48:14 ls -ld .
history -w
-kommandoen skriver imidlertid alltid historikkfilen i det interne formatet av:
#1437659315 ls -ld .
dvs. på 2 linjer holder den første linjen tiden i sekunder «siden epoken» (dvs. 1. jan 1970) med en #
foran, slik at den ikke blir forvekslet med en kommando.
Kommentarer
- Jeg ønsker å fange historikk på daglig basis, over skript fungerer, men det tilordner nåværende dato til alle kommandoer. Også etter hver kommando genererer ett nummer, som jeg ikke ønsker '. Hvis noen kan hjelpe, vil det være veldig nyttig
- Jeg vet ikke hva du mener med " ett nummer genererer ". Kan du redigere det opprinnelige spørsmålet ditt med et eksempel på hvilke filer du vil få, og innholdet?
- 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 meldingene genererer
- det er vanskelig å lese dette i en kommentar. fjern kommentarene dine og rediger spørsmålet du opprinnelig skrev, takk.
Svar
I bash er det et alternativ som instruerer bash om å registrere et tidsstempel med hver kommando. Du gjør dette ved å tilordne en nyttig verdi til miljøvariabelen HISTTIMEFORMAT
. Fra bash
manpage:
Hvis denne variabelen er satt og ikke null, brukes verdien som en formatstreng for
strftime(3)
for å skrive ut tidsstempelet assosiert med hver historikkoppføring som vises av den innebygde historikken. Hvis denne variabelen er angitt, blir tidsstempler skrevet til historikkfilen, slik at de kan bevares på tvers av skalløkter. Dette bruker historikkommentartegnet for å skille tidsstempler fra andre historikklinjer.
I mitt miljø bruker jeg
HISTTIMEFORMAT="%s (%H:%M:%S):"
Slik at kommandoene kan sorteres enkelt (%s
er tidsstempel i sekunder) og lesbare for mennesker. Når jeg skriver inn history
i skallet mitt, ser jeg noe som følger:
3 1437664568 (17:16:08):man bash 4 1437664699 (17:18:19):history
EDIT: OPs spørsmål ikke fullstendig besvart.
Også vil jeg utvide skriptet for å ta inkrementell sikkerhetskopi av historikkutdatafilen
Jeg er ikke sikker på hva du mener med «trinnvis sikkerhetskopiering» av historikkfilen. Kanskje du bare vil at historikken skal sikkerhetskopieres med jevne mellomrom. Det er et par tilnærminger du kan ta:
- Sett PROMPT_COMMAND-variabelen med
history -a
for å kontinuerlig oppdatere historikkommandoen etter hver påkallelse (i motsetning til å vente på utlogging). - Fell avbrekkingen signal med en funksjon du definerer. Hver gang en kommando blir skrevet inn, blir funksjonen kalt. Fra funksjonen kan du gjøre alt. (Litt mer pålitelig enn PROMPT_COMMAND).
- cronjob for periodisk å kopiere / arkivere historikkfilen.
Kommentarer
- Takk for forslag, men jeg har ' testet ovenfor. Kan du utdype mer om historie -a. Shell-skript fungerer bra, men feil tidsstempler.Dette er det ene problemet, og et annet er ett tall etter hver kommando som starter med #. for f.eks. # 1435987168.
-
#1435987168
i historikkfilen er tidsstempelet ! Det er et par måter å konvertere det til brukervennlig format, inkludert: last historikkfilen i bash medhistory -n _filename_
og deretterhistory
. Eller du kan gjøre noe slikt:perl -lane '{ /^#(\d+)$/&&print "#".localtime($1) or print;}' $HISTFILE
for å vise historikken med tidsstemplene. Så det ' er sannsynligvis at tidsstemplene er riktige, men du har et stedsproblem eller tidssoneproblem? - Utfør nærmere om
history -a
?? Mannssiden er litt misvisende. Den legger til den gjeldende øktloggen til filen som er utpekt av $ HISTFILE. Etterfølgende samtaler vil legge til historikken som ble generert siden forrige påkalling (den ' t overskriver hele filen igjen og igjen)