Wpis z mikrobloga

Ciekawostka: Linux domyślnie loguje komendy w bashu do ~/.bash_history.
Użytkownik może ten plik usunąć, przekierować do /dev/null itp itd.
Jednym ze sposobów na logowanie KAŻDEJ komendy w bashu KAŻDEGO użytkownika jest:

1) Do pliku /etc/bash.bashrc (/etc/bashrc w niektórych distro) dopisz:

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'
2) Stwórz plik /etc/rsyslog.d/bash.conf i dodaj:

local6.* /var/log/bash.log
3) Zrestartuj rsyslog:

sudo service rsyslog restart
Od teraz każdy wpis w bashu będzie natychmiastowo logowany do /var/log/bash.log - łącznie z datą, nazwą usera i komendą, przykład:

[root@whatever ~]# uptime
23:04:37 up 1153 days, 15:40, 1 user, load average: 0.09, 0.05, 0.01

[root@whatever ~]# tail /var/log/bash.log -n 1
Mar 7 23:04:37 whatever maybe: root [24891]: 2020-03-07 23:04:37 # uptime [0]

#linux
  • 18
  • Odpowiedz
@Ponc3k: Ależ oczywiście, że działa, cokolwiek nie wpiszesz i nie zaakceptujesz enterem, będzie zalogowane:

[root@whatever ~]# elo
-bash: elo: command not found
[root@whatever ~]# elo2
-bash: elo2: command
  • Odpowiedz
to teraz przed komendą dodaj spację i już Twój trik nie działa


@Ponc3k: @maybe: raczej zadziała ale możesz nadpisać PROMPT_COMMAND.

Tak swoją drogą z tego co kojarzę tylko w debianowych komenda ze spacja nie zapisuje historii.
  • Odpowiedz
@Ponc3k: @Kryspin013: Właśnie testuje na RHEL8 - kilkanaście spacji dałem:

[root@whatever ~]# siema?
-bash: siema?: command not found
[root@whatever ~]# tail -n1 /var/log/bash.log
Mar 7 23:12:49 whatever konrad: root [25272]: 2020-03-07 23:12:49 # siema? [127]
[root@whatever ~]#
  • Odpowiedz
@maybe: Chociaż @Ponc3k: ma rację. Wydaje mi się, że jednak nie zadziała ci w distro, który nie zapisuje historii po spacji w poleceniu. Centosy i rhele domyślnie zapisują wszystko. Sprawdź na debianie.
  • Odpowiedz
to siedzi w zmiennej HISTCONTROL, Centosy (przynajmniej 6, 7) mają tam chyba tylko ignoredups (nie zapisują duplikatów) domyślnie. Dopisanie ignorespace daje efekt jak w Debianowych distro.


@wonsz_smieszek: domyślałem się, w praktyce nigdy nie chciało mi się sprawdzić. Dzięki :D
  • Odpowiedz
Jednym ze sposobów na logowanie KAŻDEJ komendy w bashu KAŻDEGO użytkownika jest:


@maybe: Lepszym sposobem jest dopisanie jednej linijki w kodzie basha i podmiana binarki w /bin/. Oczywiście wciąż da się to obejść poprzez odpalenie innej kopii basha lub innego shella.
  • Odpowiedz
@mateusza: no to pomogłeś XD myślałem, że może jest jakiś przełącznik już w kodzie gotowy / ewentualnie jakieś tldr gdzie to konkretnie zrobić w projekcie w C, który ma milion linijek kodu. To, że można przepisać basha od nowa to chyba każdy zdaje sobie sprawę, że można.
  • Odpowiedz
Ciekawostka: Linux domyślnie loguje komendy w bashu do ~/.bashhistory.


To nie jest ciekawostka, to jest funkcjonalność terminala. W sumie każdego ogarniętego terminala.
Ten z Windowsa ma to samo. Na MacOS to samo. DOS chyba też trzymał historię.

Użytkownik może ten plik usunąć, przekierować do /dev/null itp
  • Odpowiedz