Wymagane jest przechwycenie historii wiersza poleceń w pliku z określoną datą i godziną wykonania poleceń.

Poniższy skrypt przechwytuje historię wraz z datą i godziną, ale przypisuje również bieżącą datę i godzinę do starszych poleceń. Chcę również rozszerzyć skrypt, aby wykonywał przyrostową kopię zapasową pliku wyjściowego historii.

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

Komentarze

  • Nie ' nie używaj do tego historii powłoki. Użyj księgowania lub sudo (i loguj polecenia sudo).
  • Jak używać księgowości lub sudo do przechwytywania historii w pliku
  • sudo można skonfigurować tak, aby przechwytywało jego historię (a nawet dane wyjściowe tty ) do pliku (lub przez syslog). Co masz na myśli przez " księgowość "?
  • @SunLynx, patrz Jak zarejestrować każde wpisane polecenie?

Odpowiedź

Niezupełnie to, czego potrzebujesz chciał, ale możesz uzyskać bash, aby automatycznie dodawać znaczniki czasu do każdej linii w historii. Po prostu ustaw, na przykład:

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

Polecenie history bez argumentów pokaże wtedy wpisy historii w następujący sposób:

23Jul1515:48:14 ls -ld . 

history -w jednak zawsze zapisuje plik historii w formacie wewnętrznym z:

#1437659315 ls -ld . 

ie w dwóch wierszach pierwsza linia zawiera czas w sekundach „od epoki” (tj. 1 stycznia 1970 r.) z # na początku, aby nie był mylony z poleceniem.

Komentarze

  • Chcę codziennie rejestrować historię, powyższy skrypt działa, ale przypisuje aktualną datę do wszystkich poleceń. Również po każdym poleceniu generowana jest jedna liczba, której ' nie chcę. Jeśli ktoś może pomóc, będzie to naprawdę pomocne.
  • Nie wiem, co masz na myśli, mówiąc ", jedna liczba generuje ". Czy możesz edytować swoje pierwotne pytanie, podając przykład plików, które chcesz pobrać, i ich zawartość?
  • 598 05Jul15 00: 00: 01less .bash_history 599 05Jul15 00: 00: 01 # 1435987168 600 05Jul15 00: 00: 01man rsync 601 05Lip15 00: 00: 01 # 1435988263 602 05Lip15 00: 00: 01ls -lrt / srv / cloud- * 603 05Lip15 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
  • tak jak ta wiadomość generuje
  • trudno to przeczytać w komentarzu. usuń swoje komentarze i edytuj pytanie , które pierwotnie napisałeś.

Odpowiedź

W bashu istnieje opcja, która instruuje bash, aby zapisywał znacznik czasu dla każdego polecenia. Robisz to, przypisując użyteczną wartość do zmiennej środowiskowej HISTTIMEFORMAT. Ze strony podręcznika bash:

Jeśli ta zmienna jest ustawiona, a nie pusta, jej wartość jest używana jako ciąg formatu dla strftime(3), aby wydrukować znacznik czasu powiązany z każdym wpisem historii wyświetlanym przez wbudowaną historię. Jeśli ta zmienna jest ustawiona, znaczniki czasu są zapisywane w pliku historii, dzięki czemu mogą być zachowane podczas sesji powłoki. Używa znaku komentarza historii, aby odróżnić znaczniki czasu od innych linii historii.

W moim środowisku używam

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

Aby polecenia były łatwo sortowane (%s to znacznik czasu w sekundach) i czytelne dla człowieka. Kiedy w mojej powłoce wpisuję history, widzę coś takiego:

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

EDYTUJ: pytanie OP brak pełnej odpowiedzi.

Chcę również rozszerzyć skrypt, aby wykonywał przyrostową kopię zapasową wyjściowego pliku historii.

Nie jestem pewien, co masz na myśli mówiąc o „przyrostowej kopii zapasowej” pliku historii. Być może po prostu chcesz, aby okresowo tworzyła się kopię zapasową historii. Jest kilka podejść, które możesz zastosować:

  • Ustaw zmienną PROMPT_COMMAND za pomocą history -a, aby stale aktualizować polecenie historii po każdym wywołaniu (zamiast czekać na wylogowanie).
  • Uwięź DEBUG sygnał z funkcją, którą zdefiniujesz. Za każdym razem, gdy zostanie wprowadzone polecenie, funkcja zostanie wywołana. Z poziomu funkcji możesz zrobić wszystko. (Nieco bardziej niezawodny niż PROMPT_COMMAND).
  • cronjob do okresowego kopiowania / archiwizacji plik historii.

Komentarze

  • Dziękuję za sugestie, ale ' testowałem powyżej. Czy mógłbyś szerzej opowiedzieć o historii -a. Skrypt powłoki działa dobrze, ale niewłaściwe znaczniki czasu.To jest jeden problem, a drugi to jedna liczba po każdym poleceniu zaczynającym się od #. np. # 1435987168.
  • Element #1435987168 w pliku historii to sygnatura czasowa ! Istnieje kilka sposobów, aby przekonwertować to na format przyjazny dla użytkownika, w tym: załaduj plik historii do bash za pomocą history -n _filename_, a następnie history . Możesz też zrobić coś takiego: perl -lane '{ /^#(\d+)$/&&print "#".localtime($1) or print;}' $HISTFILE, aby wyświetlić historię ze znacznikami czasu. Więc ' prawdopodobnie sygnatury czasowe są poprawne, ale masz problem z ustawieniami regionalnymi lub strefą czasową?
  • Rozwiąż problem history -a ?? Strona podręcznika jest trochę myląca. Dołącza bieżącą historię sesji do pliku wyznaczonego przez $ HISTFILE. Kolejne wywołania będą dołączały historię wygenerowaną od ostatniego wywołania (nie ' t nadpisują cały plik w kółko)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *