Registra todos os comandos digitados em qualquer shell: output (da função logger para syslog-ng / journald) contém entradas duplicadas para comandos?

4

Eu instalei syslog-ng para usar na minha área de trabalho (Gentoo 64bit, atualizado para systemd ie era OpenRC antes , com Openbox e Slim apenas) com meu usuário normal para registrar todos os comandos eu digito no shell (bash primeiro, depois eventualmente zsh). Eu explorei diferentes soluções, e diferentes formas de configurar isso, antigo e novo e geralmente isso é obtido usando o arquivo .bash_history . Estou tentando implementar esta solução de alguns anos atrás, com confiança no companheiro armadilha . Primeiro, eu modifiquei .bashrc e configurei algumas variáveis de histórico porque a solução depende da formatação dos dados do histórico, então, certificando-se de que ele foi salvo em seu arquivo e, em seguida, empurrando-o para o sistema de mensagens de log com logger em uma função chamada no ambiente do shell. Então, primeiro as variáveis:

export HISTCONTROL=
export HISTFILE=$HOME/.bash_history
export HISTFILESIZE=2000
export HISTIGNORE=
export HISTSIZE=1000
export HISTTIMEFORMAT="%a %b %Y %T %z "

typeset -r HISTCONTROL
typeset -r HISTFILE
typeset -r HISTFILESIZE
typeset -r HISTIGNORE
typeset -r HISTSIZE
typeset -r HISTTIMEFORMAT

shopt -s cmdhist
shopt -s histappend

PROMPT_COMMAND="history -a"
typeset -r PROMPT_COMMAND

ex. history command output with timestamps
860  Tue Jan 2014 10:33:50 -0900 exit
861  Tue Jan 2014 10:33:56 -0900 ls
862  Tue Jan 2014 10:33:58 -0900 history

Depois, conforme explicado no artigo vinculado, você deve adicionar esta armadilha que usa logger em .bashrc (há referência a / etc / profile, mas aqui eu quero isso apenas para meu usuário regular e ~ / .profile é not sourced por algo como lxterminal ):

function log2syslog
{
   declare command
   command=$(fc -ln -0)
   logger -p local1.notice -t bash -i -- $USER : $command
}
trap log2syslog DEBUG

Um único hífen longo foi (erroneamente?) usado no documento original, seguido por um espaço e $ USER.

Eu substituí meu arquivo de configuração original do syslog-ng. Eu tentei a configuração sugerida do Arch, mas depois de alguns avisos, eu configurei como < a href="http://www.gentoo.org/doc/en/security/security-handbook.xml?part=1&chap=3#doc_chap4"> então explicado para o Gentoo, que é o que o Arch doc é baseado em qualquer maneira:

@version: 3.4
options {
        chain_hostnames(no);

        # The default action of syslog-ng is to log a STATS line
        # to the file every 10 minutes.  That's pretty ugly after a while.
        # Change it to every 12 hours so you get a nice daily update of
        # how many messages syslog-ng missed (0).
        stats_freq(43200);
};

source src {
    unix-dgram("/dev/log" max-connections(256));
    internal();
};

source kernsrc { file("/proc/kmsg"); };

# define destinations
destination authlog { file("/var/log/auth.log"); };
destination syslog { file("/var/log/syslog"); };
destination cron { file("/var/log/cron.log"); };
destination daemon { file("/var/log/daemon.log"); };
destination kern { file("/var/log/kern.log"); };
destination lpr { file("/var/log/lpr.log"); };
destination user { file("/var/log/user.log"); };
destination mail { file("/var/log/mail.log"); };

destination mailinfo { file("/var/log/mail.info"); };
destination mailwarn { file("/var/log/mail.warn"); };
destination mailerr { file("/var/log/mail.err"); };

destination newscrit { file("/var/log/news/news.crit"); };
destination newserr { file("/var/log/news/news.err"); };
destination newsnotice { file("/var/log/news/news.notice"); };

destination debug { file("/var/log/debug"); };
destination messages { file("/var/log/messages"); };
destination console { usertty("root"); };

# By default messages are logged to tty12...
destination console_all { file("/dev/tty12"); };

# ...if you intend to use /dev/console for programs like xconsole
# you can comment out the destination line above that references /dev/tty12
# and uncomment the line below.
#destination console_all { file("/dev/console"); };

# create filters
filter f_authpriv { facility(auth, authpriv); };
filter f_syslog { not facility(authpriv, mail); };
filter f_cron { facility(cron); };
filter f_daemon { facility(daemon); };
filter f_kern { facility(kern); };
filter f_lpr { facility(lpr); };
filter f_mail { facility(mail); };
filter f_user { facility(user); };
filter f_debug { not facility(auth, authpriv, news, mail); };
filter f_messages { level(info..warn)
        and not facility(auth, authpriv, mail, news); };
filter f_emergency { level(emerg); };

filter f_info { level(info); };
filter f_notice { level(notice); };
filter f_warn { level(warn); };
filter f_crit { level(crit); };
filter f_err { level(err); };
filter f_failed { message("failed"); };
filter f_denied { message("denied"); };

# connect filter and destination
log { source(src); filter(f_authpriv); destination(authlog); };
log { source(src); filter(f_syslog); destination(syslog); };
log { source(src); filter(f_cron); destination(cron); };
log { source(src); filter(f_daemon); destination(daemon); };
log { source(kernsrc); filter(f_kern); destination(kern); };
log { source(src); filter(f_lpr); destination(lpr); };
log { source(src); filter(f_mail); destination(mail); };
log { source(src); filter(f_user); destination(user); };
log { source(src); filter(f_mail); filter(f_info); destination(mailinfo); };
log { source(src); filter(f_mail); filter(f_warn); destination(mailwarn); };
log { source(src); filter(f_mail); filter(f_err); destination(mailerr); };

log { source(src); filter(f_debug); destination(debug); };
log { source(src); filter(f_messages); destination(messages); };
log { source(src); filter(f_emergency); destination(console); };

# default log
log { source(src); destination(console_all); };

É de notar o comentário do wiki do Arch sobre a referência de unix-stream que se comporta mal e que proíbe o carregamento do syslog -Não na inicialização. Mudar a referência para unix-dgram cuida disso é basicamente a única mudança em relação ao modelo usado, exceto para fornecer um número de versão na primeira linha. Depois disso, você pode fazer systemctl enable syslog-ng para ter isso disponível na inicialização.

Por isso, está instalado e funcionando manualmente aqui:

# systemctl status syslog-ng
syslog-ng.service - System Logger Daemon
   Loaded: loaded (/usr/lib64/systemd/system/syslog-ng.service; disabled)
   Active: active (running) since Tue 2014-01-28 20:23:36 EST; 1s ago
     Docs: man:syslog-ng(8)
 Main PID: 9238 (syslog-ng)
   CGroup: /system.slice/syslog-ng.service
           \u2514\u25009238 /usr/sbin/syslog-ng -F

Jan 28 20:23:36 gentoouser3x86_64 systemd[1]: Starting System Logger Daemon...
Jan 28 20:23:36 gentoouser3x86_64 systemd[1]: Started System Logger Daemon.

E eu recebo a saída básica desejada em / var / log / messages:

Jan 28 20:42:00 gentoouser3x86_64 bash[9878]: myuser : shopt
Jan 28 20:42:04 gentoouser3x86_64 bash[9880]: myuser : su -
...
Jan 29 03:30:58 gentoouser3x86_64 bash[4386]: myuser : ls
Jan 29 03:30:58 gentoouser3x86_64 bash[4389]: myuser : ls  <--- duplicate
Jan 29 03:30:58 gentoouser3x86_64 bash[4391]: myuser : ls  <--- entries
Jan 29 04:36:31 gentoouser3x86_64 bash[4491]: myuser : cat .bashrc
Jan 29 04:37:14 gentoouser3x86_64 bash[4495]: myuser : cat .bashrc  <---
Jan 29 04:37:14 gentoouser3x86_64 bash[4497]: myuser : cat .bashrc  <---
Jan 29 04:37:35 gentoouser3x86_64 bash[4500]: myuser : nedit .bashrc
Jan 29 04:37:35 gentoouser3x86_64 bash[4503]: myuser : nedit .bashrc  <---
Jan 29 04:37:35 gentoouser3x86_64 bash[4505]: myuser : nedit .bashrc  <---

Ou, se eu desabilitar o syslog-ng com systemctl stop syslog-ng , recebo a mesma saída do log binário do journald usando journalctl -f (ou journalctl -f -o verbose para os detalhes) porque systemd " assume o controle " Aquele caso. Reiniciar syslog-ng e / ou seu soquete recupera a saída imediatamente e a envia para seus arquivos variados especificados em sua configuração.

Perguntas

  • Se eu uso syslog-ng ou journald, recebo muitas linhas duplicadas nos logs, enquanto os comandos foram executados apenas uma vez. A listagem do conteúdo de um diretório, por exemplo, pode mostrar ls 2-3 vezes nos logs quando eu uso muitas janelas de terminal. Em particular, pressionar enter na CLI parece ecoar o último comando no log. Por quê? (É porque a variável na armadilha ainda está definida para a última linha do arquivo de histórico? Se sim, como isso pode ser corrigido?)

O principal link da fonte indica que, desde a versão 4.1, bash pode gravar diretamente no syslog ... o changelog diz:

"There is a new configuration option (in config-top.h) that forces bash to forward all history entries to syslog."

  • Então a função de trap usada aqui ainda é útil ou é obsoleta? É a maneira mais moderna / elegante de fazer isso? Essa opção > 4.1 está exposta em algum lugar ou você precisa recompilar o bash para fazer isso? O que é isso?
  • Além das opções integradas que são nativas do bash, podemos esperar implementar uma solução semelhante para zsh ? Ou, novamente, existe uma maneira melhor e mais integrada de fazer isso?
  • Existe muita sobrecarga gerada pelo envio de todos os comandos para os logs e o journald e o syslog-ng são iguais a esse respeito?
por jus cogens prime 29.01.2014 / 12:45

3 respostas

5

Você tem muita coisa acontecendo por aí ..... Minha melhor resposta para isso é explicar simplesmente como eu vi o registro de sessão feito no passado. Espero que isso lhe dê algumas opções para explorar.

  1. Como você já mencionou, puxando o bash history de as contas de usuário. Isso só funciona depois que a sessão terminar. Não realmente a melhor opção, mas é fácil e confiável.
  2. Usando um virtual terminal , como o comando screen no Linux. Isso não é muito robusto, uma vez que começa no login do usuário, no entanto, se eles sabem que está sendo registrado, você ainda pode matar o serviço. Isso funciona bem em um cenário de usuário final. Os usuários finais geralmente ficam presos em uma área específica de qualquer maneira e não têm o conhecimento para contornar isso.
  3. Módulo Pam_tty_audit & aureport --tty Esta é uma ferramenta que permite que você especificar quais usuários serão registrados e permitir que você especifique o armazenamento localização dos referidos logs ... como sempre manter os logs do host servidor. Eu tenho os logs de sessão em nosso servidor SFTP sendo copiado para um servidor de registro central e um cronjob local movendo-os para um não local compartilhado para arquivamento.

Isto está embutido no RedHat e no Fedora, mas você pode instalá-lo no Debian e no Ubuntu. Faz parte do pacote auditd, acredito. Veja algumas documentação sobre auditd e o necessário < href="http://jaredrobinson.com/blog/linux-tty-auditing/"> alterações na configuração para pam (em /etc/pam.d/system-auth), especificando um único usuário aqui ( raiz):

session required pam_tty_audit.so disable=* enable=root

Exemplo de saída de aureport --tty :

TTY Report
===============================================
# date time event auid term sess comm data
===============================================
1. 1/29/2014 00:08:52 122249 0000 ? 4686960298 bash "ls -la",<ret> 

Existem milhões de maneiras de fazer isso ... Eu não tenho nada específico para seus exemplos. Também sua pergunta é um pouco enganosa. Espero que isto ajude.

    
por 29.01.2014 / 15:57
1

Essa é a solução que cuida da primeira pergunta, além de introduzir o uso de auditoria interativamente, fora da solução do módulo pam_tty fornecida na outra resposta.

bash

Primeiro, conforme explicado por um colaborador, pode haver problemas de sintaxe com a configuração original e há uma maneira melhor de fazer isso usando o Variável $ BASH_COMMAND :

The command currently being executed or about to be executed, unless the shell is executing a command as the result of a trap, in which case it is the command executing at the time of the trap.

Atualizando a referência original do prompt_command e a função como funciona:

PROMPT_COMMAND=$(history -a)
typeset -r PROMPT_COMMAND

function log2syslog
{
   declare command
   command=$BASH_COMMAND
   logger -p local1.notice -t bash -i -- $USER : $command

}
trap log2syslog DEBUG

Portanto, as novas linhas do histórico são gravadas no arquivo bash_history toda vez devido ao PROMPT_COMMAND, e como o $ BASH_COMMAND está na interceptação, o comando digitado no CLI é o comando que está sendo executado. Se eu remover o histórico -a, eu posso ver meu PS1 sendo ecoado. Funciona perfeitamente e remove todas as linhas duplicadas. A saída inclui também a expansão de alias por algum motivo.

Também é possível fazer isso sem a interceptação usando apenas PROMPT_COMMAND, assim:

PROMPT_COMMAND='history -w; history -a; history -r; command=$(fc -ln 0); logger -p local1.notice -t bash -i -- $USER : $command'

Ele não mostra expansão de alias, mas tem um pequeno defeito que não posso corrigir: se você simplesmente pressionar enter com nada mais na linha, ele envia o último comando para os logs. Você não pode mesclar as opções de histórico do arwn. Escrevemos a história que temos que arquivar, depois escrevemos o histórico anexado desde o início da sessão, depois lemos de volta e depois procuramos a última linha.

zsh

Com o zsh, podemos usar a função interna precmd , semelhante a P_C, assim, com um shell opção do shell específico do shell, tudo em .zshrc :

 setopt incappendhistory

 precmd () {
    command="$(fc -n -e - -l -1)"
    logger -p local1.notice -t zsh -i "$USER : $command"
}

E é isso!

Auditoria

Auditoria é um pacote de auditoria que contém um daemon com plug-ins e recursos de relatório. Ele usa uma abordagem baseada em regras (consulte o exemplo de audit.rules orientado à segurança aqui ) para capturar e eventos de log. Instale o pacote e verifique se você tem isso em /etc/conf.d/auditd :

AUDITD_LANG=en_US
AUDITD_DISABLE_CONTEXTS="no"

Você também pode revisar muitas outras opções em /etc/audit/auditd.conf , incluindo o caminho do registro ( /var/log/audit/audit.log por padrão).

O framework também inclui um dispatcher com plugins, incluindo um que tem a capacidade de escrever diretamente para syslog , se assim for desejado, por conveniência. Você deve primeiro ativá-lo em /etc/audisp/plugins.d/sysconf ativando active :

active = yes
direction = out
path = builtin_syslog
type = builtin 
args = LOG_INFO
format = string

Você também encontrará os recursos (audisp-remote) no dispatcher para o log remoto, mas isso não precisa ser definido para ativar o envio para o syslog aqui. Se você ativar o plug-in do syslog e o journald for usado em vez do syslog, o journald mostrará a saída, assim como /var/log/audit/audit.log (configuração padrão). Quando a configuração estiver concluída, você poderá iniciar o daemon com auditd -s enable . Nos logs:

Started dispatcher: /sbin/audispd pid: 3869
audispd[3869]: priority_boost_parser called with: 4
audispd[3869]: max_restarts_parser called with: 10
audispd[3869]: syslog plugin initialized
audispd[3869]: audispd initialized with q_depth=120 and 1 active plugins
audispd[3869]: node=gentoouser3x86_64 type=DAEMON_START msg=audit(1391089266.449:1498): auditd start, ver=2.1.3 format=raw kernel=3.10.2...res=success
auditd[3867]: Init complete, auditd 2.1.3 listening for events (startup state enable)

you can easily check the status too with auditctl -s:
AUDIT_STATUS: enabled=1 flag=1 pid=3867 rate_limit=0 backlog_limit=64 lost=21 backlog=0

O uso interativo não exige isso, mas se você não tiver uma unidade auditd.service válida para gerenciar com systemctl para iniciar na inicialização, você poderá simplesmente incluir audit=1 como um parâmetro de inicialização do kernel muitas vezes isso foi implementado no nível do kernel.

A estrutura agora está ativa e você pode interceptar seletivamente os eventos de forma interativa no cli usando auditctl . Toneladas de opções estão disponíveis. Em particular, podemos monitorar as chamadas de sistema EXECVE e ver os comandos usados no shell como argumentos aqui:

# auditctl -a exit,always -F arch=b64 -S execve
(audit.log output)
type=EXECVE msg=audit(1391090877.859:98): argc=3 a0="ls" a1="--color=auto" a2="-la"
type=CWD msg=audit(1391090877.859:98):  cwd="/root"
type=PATH msg=audit(1391090877.859:98): item=0 name="/bin/ls" inode=4194395 dev=08:34 mode=0100755 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL
type=PATH msg=audit(1391090877.859:98): item=1 name=(null) inode=1613135 dev=08:34 mode=0100755 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL
type=SYSCALL msg=audit(1391090887.955:99): arch=c000003e syscall=59 success=yes exit=0 a0=1de21f0 a1=1de10c0 a2=1db7960 a3=7fff3691a390 items=2 ppid=3994 pid=4006 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 ses=1 tty=pts2 comm="clear" exe="/usr/bin/clear" key=(null)
type=EXECVE msg=audit(1391090887.955:99): argc=1 a0="clear"
type=CWD msg=audit(1391090887.955:99):  cwd="/root"
type=PATH msg=audit(1391090887.955:99): item=0 name="/usr/bin/clear" inode=1966198 dev=08:34 mode=0100755 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL

Here's a sample showing both outputs from our trap function and
auditd appearing in our log using journald (which also shows our logger command in the 'trap'):

bash[4410]: myuser : ls --color=auto
audispd[3869]: node=gentoomyuser3x86_64 type=SYSCALL msg=audit(1391096772.067:120): arch=c000003e syscall=59 success=yes exit=0 a0=8e5a10 a1=8e4a60 a...
audispd[3869]: node=gentoomyuser3x86_64 type=EXECVE msg=audit(1391096772.067:120): argc=2 a0="ls" a1="--color=auto"
audispd[3869]: node=gentoomyuser3x86_64 type=CWD msg=audit(1391096772.067:120):  cwd="/home/myuser"
audispd[3869]: node=gentoomyuser3x86_64 type=PATH msg=audit(1391096772.067:120): item=0 name="/bin/ls" inode=4194395 dev=08:34 mode=010075...type=NORMAL
audispd[3869]: node=gentoomyuser3x86_64 type=PATH msg=audit(1391096772.067:120): item=1 name=(null) inode=1613135 dev=08:34 mode=0100755 o...type=NORMAL
audispd[3869]: node=gentoomyuser3x86_64 type=EOE msg=audit(1391096772.067:120):
audispd[3869]: node=gentoomyuser3x86_64 type=SYSCALL msg=audit(1391096807.548:121): arch=c000003e syscall=59 success=yes exit=0 a0=8e5c50 a1=8e6430 a...
audispd[3869]: node=gentoomyuser3x86_64 type=EXECVE msg=audit(1391096807.548:121): argc=10 a0="logger" a1="-p" a2="local1.notice" a3="-t" ..." a9="date"
audispd[3869]: node=gentoomyuser3x86_64 type=CWD msg=audit(1391096807.548:121):  cwd="/home/myuser"
audispd[3869]: node=gentoomyuser3x86_64 type=PATH msg=audit(1391096807.548:121): item=0 name="/usr/bin/logger" inode=1966477 dev=08:34 mod...type=NORMAL
audispd[3869]: node=gentoomyuser3x86_64 type=PATH msg=audit(1391096807.548:121): item=1 name=(null) inode=1613135 dev=08:34 mode=0100755 o...type=NORMAL
audispd[3869]: node=gentoomyuser3x86_64 type=EOE msg=audit(1391096807.548:121):
bash[4415]: myuser : date
audispd[3869]: node=gentoomyuser3x86_64 type=SYSCALL msg=audit(1391096807.549:122): arch=c000003e syscall=59 success=yes exit=0 a0=8e5f40 a1=8e5cd0 a...
audispd[3869]: node=gentoomyuser3x86_64 type=EXECVE msg=audit(1391096807.549:122): argc=1 a0="date"
audispd[3869]: node=gentoomyuser3x86_64 type=CWD msg=audit(1391096807.549:122):  cwd="/home/myuser"
audispd[3869]: node=gentoomyuser3x86_64 type=PATH msg=audit(1391096807.549:122): item=0 name="/bin/date" inode=4194318 dev=08:34 mode=0100...type=NORMAL
audispd[3869]: node=gentoomyuser3x86_64 type=PATH msg=audit(1391096807.549:122): item=1 name=(null) inode=1613135 dev=08:34 mode=0100755 o...type=NORMAL
audispd[3869]: node=gentoomyuser3x86_64 type=EOE msg=audit(1391096807.549:122):
audispd[3869]: node=gentoomyuser3x86_64 type=SYSCALL msg=audit(1391096838.004:123): arch=c000003e syscall=59 success=yes exit=0 a0=8e6c60 a1=8e6d00 a...
audispd[3869]: node=gentoomyuser3x86_64 type=EXECVE msg=audit(1391096838.004:123): argc=21 a0="logger" a1="-p" a2="local1.notice" a3="-t" a4="bash" a...
audispd[3869]: node=gentoomyuser3x86_64 type=CWD msg=audit(1391096838.004:123):  cwd="/home/myuser"
audispd[3869]: node=gentoomyuser3x86_64 type=PATH msg=audit(1391096838.004:123): item=0 name="/usr/bin/logger" inode=1966477 dev=08:34 mod...type=NORMAL
audispd[3869]: node=gentoomyuser3x86_64 type=PATH msg=audit(1391096838.004:123): item=1 name=(null) inode=1613135 dev=08:34 mode=0100755 o...type=NORMAL
audispd[3869]: node=gentoomyuser3x86_64 type=EOE msg=audit(1391096838.004:123):
bash[4417]: myuser : aafire -width 82 -height 25 -gamma 1 -floyd_steinberg -font mda14 -driver curses
audispd[3869]: node=gentoomyuser3x86_64 type=SYSCALL msg=audit(1391096838.006:124): arch=c000003e syscall=59 success=yes exit=0 a0=8e6c60 a1=8c3880 a...
audispd[3869]: node=gentoomyuser3x86_64 type=EXECVE msg=audit(1391096838.006:124): argc=12 a0="aafire" a1="-width" a2="82" a3="-height" a4...11="curses"
audispd[3869]: node=gentoomyuser3x86_64 type=CWD msg=audit(1391096838.006:124):  cwd="/home/myuser"
audispd[3869]: node=gentoomyuser3x86_64 type=PATH msg=audit(1391096838.006:124): item=0 name="/usr/bin/aafire" inode=1594727 dev=08:34 mod...type=NORMAL
audispd[3869]: node=gentoomyuser3x86_64 type=PATH msg=audit(1391096838.006:124): item=1 name=(null) inode=1613135 dev=08:34 mode=0100755 o...type=NORMAL
audispd[3869]: node=gentoomyuser3x86_64 type=EOE msg=audit(1391096838.006:124):
audispd[3869]: node=gentoomyuser3x86_64 type=SYSCALL msg=audit(1391096852.816:125): arch=c000003e syscall=59 success=yes exit=0 a0=8e5870 a1=8e5b20 a...
audispd[3869]: node=gentoomyuser3x86_64 type=EXECVE msg=audit(1391096852.816:125): argc=11 a0="logger" a1="-p" a2="local1.notice" a3="-t" ...su" a10="-"
audispd[3869]: node=gentoomyuser3x86_64 type=CWD msg=audit(1391096852.816:125):  cwd="/home/myuser"
audispd[3869]: node=gentoomyuser3x86_64 type=PATH msg=audit(1391096852.816:125): item=0 name="/usr/bin/logger" inode=1966477 dev=08:34 mod...type=NORMAL
audispd[3869]: node=gentoomyuser3x86_64 type=PATH msg=audit(1391096852.816:125): item=1 name=(null) inode=1613135 dev=08:34 mode=0100755 o...type=NORMAL
audispd[3869]: node=gentoomyuser3x86_64 type=EOE msg=audit(139109

... termine a saída simplesmente removendo as regras ativas com auditctl -D ou interrompa toda a auditoria com auditd -s disable ou auditctl -e 0 . Nós não conseguimos ver todas as seqüências de caracteres digitadas no terminal usando esta regra, mas registramos todos os comandos.

    
por 30.01.2014 / 15:40
0

Adicione a seguinte linha em / etc / profiles ou ~ / .bashrc

 PROMPT_COMMAND='history -a >(tee -a ~/.bash_history | logger -t "$USER[$$] $SSH_CONNECTION")'

isto irá enviar o comando juntamente com o usuário ssh / ip para / var / log / messages ou / var / log / syslog

    
por 03.08.2016 / 06:47