Požadavkem je zachytit historii příkazového řádku do souboru se specifickým datem a časem, kdy byly příkazy provedeny.

Níže uvedený skript zachycuje historii s datem a časem, ale také přiřazuje aktuální datum a čas starším příkazům. Také chci rozšířit skript tak, aby inkrementálně zálohoval výstupní soubor historie.

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

Komentáře

  • Nepoužívejte ' k tomu historii prostředí. Použijte účetnictví nebo sudo (a logujte příkazy sudo).
  • Jak používat účetnictví nebo sudo pro zachycení historie v souboru
  • sudo lze nakonfigurovat tak, aby zachytilo jeho historii (a dokonce i tty výstup ) do souboru (nebo přes syslog). Co myslíte pod " účetnictvím "?
  • @SunLynx, viz Jak můžete zaznamenat každý zadaný příkaz

Odpovědět

Ne tak docela, jak jste chtěl, ale můžete získat bash automatické přidávání časových značek na každý řádek v historii. Jednoduše nastavte například:

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

Příkaz history bez argumentů poté zobrazí vaše položky historie takto:

23Jul1515:48:14 ls -ld . 

history -w příkaz však vždy zapíše soubor historie do interního formátu z:

#1437659315 ls -ld . 

tj na 2 řádcích, první řádek obsahuje čas v sekundách „od epochy“ (tj. 1. ledna 1970) s # vpředu, aby nebyl zaměňován s příkazem.

Komentáře

  • Chci denně zaznamenávat historii, výše uvedený skript funguje, ale všem příkazům přiřadí aktuální datum. Také po každém příkazu se vygeneruje jedno číslo, které ' nechci. Pokud někdo může pomoci, bude to opravdu užitečné
  • Nevím, co myslíte tím " jedno číslo vygeneruje ". Můžete upravit původní otázku s příkladem toho, jaké soubory chcete získat, a jejich obsah?
  • 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: 00: 01crontab -l 605 05Jul15 00: 00: 01 # 1435988290 606 05Jul15 00: 00: 01cat /srv/cloud-user_hist.sh
  • jako tato zpráva generuje
  • je těžké to přečíst v komentáři. odeberte své komentáře a upravte otázku , kterou jste původně napsali.

Odpovědět

V bash existuje možnost, která instruuje bash, aby s každým příkazem zaznamenal časové razítko. To provedete přiřazením užitečné hodnoty proměnné prostředí HISTTIMEFORMAT. Z bash manpage:

Pokud je tato proměnná nastavena a není null, použije se její hodnota jako formátovací řetězec pro strftime(3) pro tisk časového razítka spojeného s každou položkou historie zobrazenou vestavěnou historií. Pokud je tato proměnná nastavena, časová razítka se zapisují do souboru historie, aby mohla být zachována napříč relacemi prostředí. Toto používá znak komentáře historie k rozlišení časových značek od ostatních řádků historie.

V mém prostředí používám

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

Aby bylo možné příkazy snadno třídit (%s je časové razítko v sekundách) a čitelné člověkem. Když v mém shellu napíšu history, zobrazí se něco jako toto:

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

EDIT: OPs question není plně zodpovězeno.

Chci také rozšířit skript tak, aby inkrementálně zálohoval výstupní soubor historie

Nejsem si jistý, co máte na mysli pod „přírůstkovým zálohováním“ souboru historie. Možná prostě chcete, aby byla historie pravidelně zálohována. Můžete použít několik přístupů:

  • Nastavením proměnné PROMPT_COMMAND pomocí history -a budete průběžně aktualizovat příkaz historie po každém vyvolání (na rozdíl od čekání na odhlášení).
  • Trap DEBUG signál s funkcí, kterou definujete. Pokaždé, když zadáte příkaz, bude funkce vyvolána. Z této funkce můžete dělat všechno. (Mírně spolehlivější než PROMPT_COMMAND).
  • cronjob periodicky kopírovat / archivovat soubor historie.

Komentáře

  • Děkujeme za návrhy, ale ' jsem testoval výše. Můžete mi prosím vysvětlit více o historii -a. Shell skript funguje dobře, ale špatná časová razítka.Toto je jeden problém a další je jedno číslo po každém příkazu začínajícím #. např. # 1435987168.
  • #1435987168 v souboru historie je časové razítko ! Existuje několik způsobů, jak to převést do uživatelsky přívětivého formátu, včetně: načtěte soubor historie do bash pomocí history -n _filename_ a poté history . Nebo můžete udělat něco takového: perl -lane '{ /^#(\d+)$/&&print "#".localtime($1) or print;}' $HISTFILE a zobrazit historii s časovými značkami. ' je tedy pravděpodobné, že jsou časová razítka správná, ale máte problém s místním nebo časovým pásmem?
  • Vypracovat history -a ?? Manuální stránka je trochu zavádějící. Připojí aktuální historii relace k souboru určenému $ HISTFILE. Následná volání připojí historii generovanou od posledního vyvolání (nepřepíše ' celý soubor znovu a znovu)

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *