Come si aggiungono i dati di connessione alla rete o alla fonte dell'utente alle voci della cronologia?


8

Vorrei modificare le impostazioni della cronologia per tutti gli utenti sui sistemi che gestisco. Vorrei che contenesse le informazioni dal terminale di connessione come dawho

sysadmin:/ # who
sysadmin  pts/0        Mar 26 07:11 (sysadmin.doofus.local)

Attualmente modifico la mia cronologia nei seguenti modi. So che molte di queste impostazioni sono state trattate qui diverse volte. Tuttavia, ho estratto questo codice da " Ricette di amministrazione del sistema Linux di: Juliet Kemp " molto tempo fa.

shopt -s histappend
PROMPT_COMMAND='history -n;history -a'
HISTSIZE=100000
HISTFILESIZE=100000
HISTTIMEFORMAT="%m/%d/%y %T  "

shopt -s histappend risolve il problema quando si hanno più terminali aperti che potrebbero andare perse informazioni.

PROMPT_COMMAND='history -n;history -a' si estende per fornire in tempo reale l'aggiunta alla cronologia su più terminali.

HISTSIZE=100000 HISTFILESIZE=100000 estende la quantità di historyritenzione

HISTTIMEFORMAT="%m/%d/%y %T "sostituisce ogni riga della storia con un timestamp

Cosa ottieni in genere history

835  ls
836  cd ..

I miei historyrisultati attuali modificati

5853  03/26/12 07:16:49  ls
5854  03/26/12 07:16:50  ll

Il ritorno da historymi piacerebbe vedere

5853  03/26/12 07:16:49  sysadmin.doofus.local    ls
5854  03/26/12 07:16:50  sysadmin.doofus.local    ll

001  03/26/12 05:11:29  demo_user.doofus.local    cd
002  03/26/12 05:11:30  demo_user.doofus.local    ll

Non sono "sposato" nel vedere il DNSnome. Lo vorrei solo lì se lo estrae da whoo in un'altra posizione senza la necessità di eseguire una ricerca o una query di qualsiasi tipo. Sarei felice con l'indirizzo IP.

002  03/26/12 05:11:30  192.168.0.2    ll

Perché? Gestisco diversi sistemi in cui un userid condiviso da più utenti dello stesso gruppo per svolgere le proprie attività quotidiane. Ciò mi consentirebbe di correlare la loro posizione reale e l'utente reale all'interno dell'organizzazione a ciò che hanno fatto nella storia.

Sono consapevole che questo non è ottimale e vorrei cambiarlo ma, quando sei su una nave delle dimensioni di una nave da crociera, non cerchi di fare virate. (Nota: quando lo fai i passeggeri cercano di buttarti fuori bordo)

Ad ogni modo, fino a quando non sarò in grado di migrarli verso una soluzione migliore, vorrei avere questa capacità di tracciamento.

Inoltre, se hai qualche consiglio su quello che sto attualmente usando per le mie historymodifiche, mi piacerebbe ascoltarlo.

Grazie,

Modifica: 1

Non voglio eseguire altri programmi o non devo configurare nulla di aggiuntivo "entro limiti ragionevoli".

Voglio aggiungere un 0sovraccarico, se devo aggiungere deve essere piccolo.

Mi fido dei miei utenti che vorrei (se dovesse succedere qualcosa) vedere quale dei 10 utenti che hanno effettuato l'accesso al sistema con lo stesso utente: password lo ha fatto. Oppure, potrebbe non essere stato un utente, potrebbe essere stato dimenticato cronsu un sistema che esegue una connessione come utente per fare qualcosa. O un'applicazione Ex: BMC Control-Mche si connette sshed esegue attività. Non si tratta tanto di trovare "cattivi utenti" quanto di riuscire a rintracciarlo con il minimo sforzo.

Modifica 2:

I sistemi eseguono SLES e RHEL


1
Sembra che la contabilità di processo possa essere utile. La cronologia della shell non è mai stata progettata per la registrazione e, se si desidera utilizzarla, è necessario fidarsi di tutti i propri utenti. Vedere la domanda correlata sull'attività di monitoraggio e una risposta correlata .
jw013,

@ jw013 Grazie per il commento. Tuttavia, questo deve essere configurato e gestito e in più ho dato le informazioni che ho letto che sarebbe meglio escludere le directory come /proc /deve le /homedirectory degli utenti . Questo aggiunge spese generali. Considerando che historyè già in fase di registrazione e le loro informazioni di connessione sono note al sistema di connessione IP ecc ... Queste informazioni, se non già disponibili "staticamente", potrebbero essere impostate in questo modo o memorizzate in una variabile o file e inserite nei historyrecord e nel risultato delle prestazioni sarebbe molto piccolo o 0.
2bc

Se questo è su Linux, considera l'utilizzo auditd. Non sono sicuro che i suoi registri ti forniranno informazioni sufficienti. La difficoltà di ciò che desideri è proprio il motivo per cui gli account condivisi sono così criticati.
Gilles 'SO-smetti di essere malvagio' il

È su Linux, modificherò la mia domanda per chiarirlo. auditdè un po 'come se inotifydovessi dirgli cosa monitorare per i cambiamenti. Singoli file, directory, ecc. Non voglio andare a quel livello di configurazione. In effetti (lo faccio) ma essenzialmente non mi interessa così tanto. Devo puppetgestire quella roba. auditdviene fornito con il carico aggiuntivo e il tempo di installazione. Se un account sta modificando qualcosa, vorrei comunque guardare indietro nella cronologia e vedere chi o cosa sta effettuando l'accesso e provando.
2bc

2
hm, dato PROMPT_COMMAND=che esegue solo i normali comandi prima del prossimo prompt, non potresti scrivere una funzione che chiama sed / awk che funziona sull'ultima riga del file della cronologia per aggiungere le informazioni. quindi chiamare quella funzione PROMPT_COMMAND=per aggiungere i dati? sarebbe un trucco, ma dovrebbe fare il lavoro.
llua

Risposte:


1

Dal suggerimento di Llua, possiamo lavorare un po 'di più con la storia. Aggiungi una riga al file BASH RC a livello di sistema, forse /etc/bash.bashrc.

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Imposta la registrazione per "local6" nel tuo logger di sistema. Forse qualcosa del genere:

local6.*    /var/log/commands.log

Riavvia il logger di sistema. Forse impostare la rotazione del file di registro. Disconnettersi; accesso; e la cronologia ora è scritta in /var/log/commands.log in un formato come questo:

data ora nome host logger: nome utente [audit_pid]: comando [return_val]

Questo potrebbe essere ulteriormente modificato a piacere.


1

I paragrafi seguenti descrivono l'idea in generale e sono obsoleti in alcuni aspetti, ma è possibile utilizzare quindi utilizzare gli ultimi da questa pagina. Consente di utilizzare un file di grandi dimensioni ~ / .bash_history.archive (separato da HISTFILE = ~ / .bash_history). E poi all'uscita da ogni sessione di bash lasciamo aggiungere nuove righe della cronologia.

Il primo problema con questo approccio era: come fare bash per chiamare questo script ad ogni uscita? Certo se lo esci digitando 'exit' puoi alias 'exit' ma per questo uso la scorciatoia Ctrl-D e non sono riuscito a trovare un modo per riassegnarlo a qualcosa ma non ho incorporato la funzione di uscita.

Quindi il primo tentativo è stato: vietare Ctrl-D di

export IGNOREEOF=10

e definire la doppia combinazione Ctrl-X per chiamare la funzione di uscita.

Ma l'approccio giusto è usare exit tramp di bash, che è una soluzione perfetta perché viene chiamato indipendentemente dal modo in cui esci da bash: Ctrl-D, esci, chiudi la finestra di xterm.

trap 'archive_history' EXIT

Il prossimo passo è definire una linea di partenza nella nostra bash_history in modo da poter salvare solo nuove linee e assicurarci di aggiungere ad un file di cronologia.

export CURBASHSTART=`grep -v "^[ \t]*$" $HISTFILE | wc -l | awk '{print $1}'` CURBASHDATE=`date`

shopt -s cmdhist histappend

Questo è tutto ciò di cui abbiamo bisogno all'inizio della bash - ora sappiamo da quale linea di storia inizia la storia attuale (nuova). Per salvare la cronologia aggiungi il prossimo pezzo al tuo ~ / .bashrc.

archive_history()
{
    HISTORYOLD=${HISTFILE}.archive
    CURTIME=`date`
    CURTTY=`tty`
    if  [ x$HISTDUMPPED = x ]; then
      echo "#-${HOSTNAME}-- ${CURBASHDATE} - ${CURTIME} ($CURTTY) ----" >>   $HISTORYOLD

      history $(($HISTCMD-${CURBASHSTART-0})) | sed -e 's/^[ ]*[0-9][0-9]* [ ]*//g'  >> $HISTORYOLD
      export HISTDUMPPED=1
    fi
}

exit ()
{
   archive_history
   builtin exit

}

Il file ~ / .inputrc deve contenere le righe successive per ridefinire il collegamento di uscita in Ctrl-x x. Al primo tentativo potresti sentire che è una scorciatoia terribile, ma poi ti abitui - credimi.

$if Bash
# to exit through calling exit function which will archive the history
"\C-x\C-x": "exit\n"
# to dump history we have so far
"\C-x\C-w": "archive_history\n"

$endif

Inoltre, se la tua sessione bash è una sessione di accesso e esci chiamando " logout", potresti aggiungere la riga successiva alla tua~/.bash_logout

archive_history

Dopo aver eseguito tutte le azioni menzionate, puoi trovare il tuo ~/.bash_history.archivefile contenente sezioni come queste

#-belka-- Sun Oct 12 21:52:13 EDT 2003 - Sun Oct 12 21:53:25 EDT 2003 (/dev/pts/13) ----
exit
aptitude
exit
#-washoe-- Sun Oct 12 18:03:16 EDT 2003 - Sun Oct 12 23:06:48 EDT 2003 (/dev/pts/3) ----

exit
cd progr/letters/resume/
e resume.tex

che in generale può essere letto come al solito file di cronologia, se lo si desidera.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.