Il requisito è acquisire la cronologia della riga di comando in un file con data e ora specifica dei comandi, quando sono stati eseguiti.

Lo script seguente cattura la cronologia con data e ora, ma assegna anche la data e lora correnti per i comandi meno recenti. Inoltre, voglio estendere lo script per eseguire il backup incrementale del file di output della cronologia.

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

Commenti

  • Non ' utilizzare la cronologia della shell per questo. Usa account o sudo (e registra i comandi sudo).
  • Come usare account o sudo per lacquisizione della cronologia in un file
  • sudo può essere configurato per acquisire la sua cronologia (e anche loutput di tty ) in un file (o tramite syslog). Che cosa intendi con " contabilità "?
  • @SunLynx, vedi Come puoi registrare ogni comando digitato

Risposta

Non proprio quello che hai voluto, ma puoi ottenere bash per aggiungere automaticamente i timestamp a ciascuna riga della cronologia. Imposta semplicemente, per il tuo esempio:

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

Il history comando senza argomenti mostrerà le voci della cronologia in questo modo:

23Jul1515:48:14 ls -ld . 

Il history -w tuttavia scrive sempre il file di cronologia nel formato interno di:

#1437659315 ls -ld . 

ad es su 2 righe, la prima riga contiene il tempo in secondi “dallepoca” (es. 1 gennaio 1970) con un # davanti in modo che non venga confuso con un comando.

Commenti

  • Voglio catturare la cronologia su base giornaliera, lo script precedente funziona ma assegna la data corrente a tutti i comandi. Inoltre, dopo ogni comando viene generato un numero, che ' non voglio. Se qualcuno può aiutare, sarà davvero utile
  • Non so cosa intendi con " un numero genera ". Potresti modificare la tua domanda originale con un esempio dei file che desideri ottenere e il loro contenuto?
  • 598 05Jul15 00: 00: 01less .bash_history 599 05Jul15 00: 00: 01 # 1435987168 600 05Jul15 00: 00: 01man rsync 601 05lug15 00: 00: 01 # 1435988263 602 05lug15 00: 00: 01ls -lrt / srv / cloud- * 603 05lug15 00: 00: 01 # 1435988281 604 05lug15 00: 00: 01crontab -l 605 05luglio15 00: 00: 01 # 1435988290 606 05Jul15 00: 00: 01cat /srv/cloud-user_hist.sh
  • come questo messaggio genera
  • è difficile leggerlo in un commento. rimuovi i tuoi commenti e modifica la domanda che hai scritto originariamente, per favore.

Rispondi

In bash, cè unopzione che ordina a bash di registrare un timestamp con ogni comando. Puoi farlo assegnando un valore utile alla variabile dambiente HISTTIMEFORMAT. Dalla bash manpage:

Se questa variabile è impostata e non è null, il suo valore viene utilizzato come stringa di formato per strftime(3) per stampare il timestamp associato a ciascuna voce della cronologia visualizzata dal builtin della cronologia. Se questa variabile è impostata, i timestamp vengono scritti nel file della cronologia in modo che possano essere conservati nelle sessioni della shell. Utilizza il carattere di commento della cronologia per distinguere i timestamp dalle altre righe della cronologia.

Nel mio ambiente, utilizzo

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

In modo che i comandi possano essere ordinati facilmente (%s è il timestamp in secondi) e leggibili dalluomo. Nella mia shell, quando digito history, vedo qualcosa di simile al seguente:

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

EDIT: domanda OP non completamente risposto.

Inoltre voglio estendere lo script per eseguire il backup incrementale del file di output della cronologia

Non sono sicuro di cosa intendi per “backup incrementale” del file della cronologia. Forse vuoi semplicemente eseguire periodicamente il backup della cronologia. Ci sono un paio di approcci che puoi adottare:

  • Imposta la variabile PROMPT_COMMAND con history -a per aggiornare continuamente il comando della cronologia dopo ogni invocazione (invece di attendere il logout).
  • Trap DEBUG segnale con una funzione definita. Ogni volta che viene inserito un comando, la funzione verrà chiamata. Dallinterno della funzione puoi fare tutto. (leggermente più affidabile di PROMPT_COMMAND).
  • cronjob per copiare / archiviare periodicamente il file della cronologia.

Commenti

  • Grazie per i suggerimenti, ma ' ho eseguito il test sopra. Puoi per favore approfondire di più sulla storia -a. Lo script della shell funziona correttamente ma timestamp errati.Questo è lunico problema e un altro è un numero dopo ogni comando che inizia con #. per es. # 1435987168.
  • Il #1435987168 nel file della cronologia è il timestamp ! Esistono due modi per convertirlo in un formato intuitivo, tra cui: caricare il file della cronologia in bash con history -n _filename_ e quindi history . Oppure puoi fare qualcosa del genere: perl -lane '{ /^#(\d+)$/&&print "#".localtime($1) or print;}' $HISTFILE per visualizzare la cronologia con i timestamp. Quindi ' è probabile che i timestamp siano corretti, ma hai un problema con le impostazioni locali o con il fuso orario?
  • Elaborato su history -a ?? La pagina man è un po fuorviante. Aggiunge la cronologia della sessione corrente al file designato da $ HISTFILE. Le chiamate successive aggiungeranno la cronologia generata dallultima chiamata (non ' sovrascriverà lintero file più e più volte)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *