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ępniehistory
. 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)