Cerința este de a captura istoricul liniei de comandă într-un fișier cu data și ora specifice comenzilor, când au fost executate.

Scriptul de mai jos surprinde istoricul cu data și ora, dar atribuie și data și ora curente pentru comenzile mai vechi. De asemenea, vreau să extind scriptul pentru a face o copie de rezervă incrementală a fișierului de ieșire istoric.

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

Comentarii

  • Nu ‘ nu utilizați istoricul shell pentru acest lucru. Utilizați contabilitate sau sudo (și jurnal comenzi sudo).
  • Cum se utilizează contabilitatea sau sudo pentru capturarea istoricului într-un fișier
  • sudo poate fi configurat pentru a captura istoricul său (și chiar și ieșirea tty ) într-un fișier (sau prin syslog). Ce vrei să spui prin ” contabilitate „?
  • @SunLynx, vezi Cum puteți înregistra fiecare comandă tastată

Răspundeți

Nu chiar ceea ce dorit, dar puteți obține bash pentru a adăuga marcaje temporale la fiecare linie din istoric în mod automat. Pur și simplu setați, pentru exemplul dvs.:

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

Comanda history fără argumente va afișa apoi intrările istoricului dvs. astfel:

23Jul1515:48:14 ls -ld . 

history -w totuși scrie întotdeauna fișierul istoric în formatul intern al:

#1437659315 ls -ld . 

adică pe 2 linii, prima linie reține timpul în secunde „de la epocă” (adică 1 ianuarie 1970) cu un # în față, astfel încât să nu fie confundat cu o comandă.

Comentarii

  • Vreau să capturez istoricul zilnic, deasupra scriptului funcționează, dar atribuie data curentă tuturor comenzilor. De asemenea, după fiecare comandă se generează un număr, pe care nu-l doresc ‘. Dacă cineva vă poate ajuta, acest lucru vă va fi de mare ajutor.
  • Nu știu ce vreți să spuneți prin ” un număr generează „. Ați putea să vă editați întrebarea originală cu un exemplu despre ce fișiere doriți să primiți și conținutul acestora?
  • 598 05 Iul15 00: 00: 01 fără .bash_history 599 05 Iul15 00: 00: 01 # 1435987168 600 05 Iul15 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: 00: 01cfrontab -l 605 05Jul15 00: 00 00: 01 # 1435988290 606 05Jul15 00: 00: 01cat /srv/cloud-user_hist.sh
  • generează astfel de mesaje
  • este greu să citiți acest lucru într-un comentariu. eliminați-vă comentariile și editați întrebarea pe care ați scris-o inițial, vă rog.

Răspundeți

În bash, există o opțiune care instruiește bash să înregistreze un timestamp cu fiecare comandă. Faceți acest lucru atribuind o valoare utilă variabilei de mediu HISTTIMEFORMAT. Din bash pagina de manual:

Dacă această variabilă este setată și nu este nulă, valoarea sa este utilizată ca șir de format pentru strftime(3) pentru a imprima ștampila de timp asociată cu fiecare intrare din istoric afișată de istoricul încorporat. Dacă această variabilă este setată, ștampilele de timp sunt scrise în fișierul istoric, astfel încât să poată fi păstrate în cadrul sesiunilor de shell. Aceasta folosește caracterul de comentariu istoric pentru a distinge marcajele de timp de alte linii istorice.

În mediul meu, folosesc

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

Pentru ca comenzile să poată fi sortate cu ușurință (%s este timestamp în câteva secunde) și poate fi citită de om. În shell-ul meu, când scriu history, văd ceva de genul următor:

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

EDIT: OPs question nu a fost complet răspuns.

De asemenea, vreau să extind scriptul pentru a realiza o copie de rezervă incrementală a fișierului de ieșire istoric

Nu „sunt sigur ce înțelegeți prin” backup incremental „al fișierului istoric. Poate pur și simplu doriți ca istoricul să fie backup periodic. Există câteva abordări pe care le puteți lua:

  • Setați variabila PROMPT_COMMAND cu history -a pentru a actualiza continuu comanda istoric după fiecare invocare (spre deosebire de așteptarea deconectării).
  • Captați DEBUG semnal cu o funcție pe care o definiți. De fiecare dată când este introdusă o comandă, funcția va fi apelată. Din interiorul funcției puteți face totul. (Puțin mai fiabil decât PROMPT_COMMAND).
  • cronjob pentru a copia / arhiva periodic fișierul istoric.

Comentarii

  • Vă mulțumim pentru sugestii, dar am ‘ testat mai sus. Puteți, vă rog, să elaborați mai multe despre istorie -a. Scriptul Shell funcționează bine, dar amprentele de timp greșite.Aceasta este o problemă, iar alta este un număr după fiecare comandă care începe cu #. de ex. # 1435987168.
  • #1435987168 din fișierul istoric este marca de timp ! Există câteva modalități de a converti acest lucru în format ușor de utilizat, inclusiv: încărcați fișierul istoric în bash cu history -n _filename_ și apoi history . Sau puteți face așa ceva: perl -lane '{ /^#(\d+)$/&&print "#".localtime($1) or print;}' $HISTFILE pentru a afișa istoricul cu marcajele de timp. Deci, ‘ este probabil că marcajele de timp sunt corecte, dar aveți o problemă locală sau de fus orar?
  • Elaborați pe history -a ?? Pagina manuală este puțin înșelătoare. Acesta adaugă istoricul sesiunii curente la fișierul desemnat de $ HISTFILE. Apelurile ulterioare vor adăuga istoricul generat de la ultima invocație (nu ‘ nu suprascrie întregul fișier de mai multe ori)

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *