Me gustaría modificar la configuración del historial de todos los usuarios de los sistemas que administro. Me gustaría que contuviera la información del terminal de conexión como dewho
sysadmin:/ # who
sysadmin pts/0 Mar 26 07:11 (sysadmin.doofus.local)
Actualmente modifico mi historial de las siguientes maneras. Sé que muchas de estas configuraciones se han tratado aquí varias veces. Sin embargo, saqué este código de "Recetas de administración del sistema Linux por: Juliet Kemp" Hace mucho tiempo.
shopt -s histappend
PROMPT_COMMAND='history -n;history -a'
HISTSIZE=100000
HISTFILESIZE=100000
HISTTIMEFORMAT="%m/%d/%y %T "
shopt -s histappend
soluciona el problema cuando tienes múltiples terminales abiertos y se puede perder información.
PROMPT_COMMAND='history -n;history -a'
se extiende para agregar datos en tiempo real al historial en múltiples terminales.
HISTSIZE=100000
HISTFILESIZE=100000
amplía el importe de la history
retención
HISTTIMEFORMAT="%m/%d/%y %T
" antecede cada línea de la historia con una marca de tiempo
Lo que normalmente obtienes con history
835 ls
836 cd ..
history
Mis resultados actuales modificados
5853 03/26/12 07:16:49 ls
5854 03/26/12 07:16:50 ll
El regreso de history
me gustaría ver
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
No estoy "casado" con ver el DNS
nombre. Solo lo querría allí si lo extrae de who
otra ubicación sin la necesidad de realizar una búsqueda o consulta de ningún tipo. Estaría contento con la dirección IP.
002 03/26/12 05:11:30 192.168.0.2 ll
¿Por qué? Administro varios sistemas donde existe un ID de usuario que comparten varios usuarios de un mismo grupo para realizar sus tareas diarias. Esto me permitiría correlacionar su ubicación real y usuario real dentro de la organización con lo que hicieron en el historial.
Soy consciente de que esto no es óptimo y me gustaría cambiarlo, pero cuando estás en un barco del tamaño de un crucero no intentas hacer curvas cerradas. (Nota: cuando lo hagas los pasajeros intentarán tirarte por la borda)
De todos modos, hasta que pueda migrarlos a una solución mejor, me gustaría tener esta capacidad de seguimiento.
Además, si tienes alguna recomendación sobre lo que estoy usando actualmente para mis history
modificaciones, me encantaría escucharla.
Gracias,
Editar: 1
No quiero ejecutar otros programas ni tener que configurar nada adicional "dentro de lo razonable".
Quiero agregar 0
gastos generales, si tengo que agregarlos, deben ser pequeños.
Confío en mis usuarios. Solo me gustaría (en caso de que sucediera algo) ver cuál de los 10 usuarios que iniciaron sesión en el sistema con el mismo usuario: contraseña lo hizo. O puede que no haya sido un usuario, podría haber sido olvidado cron
en un sistema que realiza una conexión como usuario para hacer algo. O una aplicación Ej: BMC Control-M
que se conecta ssh
y ejecuta tareas. No se trata tanto de encontrar "malos usuarios" sino de poder localizarlos con un mínimo de esfuerzo.
Edición 2:
Los sistemas ejecutan SLES y RHEL.
Respuesta1
A partir de la sugerencia de llua podemos trabajar un poco más con la historia. Agregue una línea al archivo BASH RC de todo el sistema, quizás /etc/bash.bashrc.
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'
Configure el registro para "local6" en el registrador de su sistema. Quizás algo como esto:
local6.* /var/log/commands.log
Reinicie el registrador del sistema. Quizás configure la rotación del archivo de registro. Cerrar sesión; acceso; y el historial ahora se escribe en /var/log/commands.log en un formato como este:
fecha hora nombre de host registrador: nombre de usuario [audit_pid]: comando [return_val]
Esto podría modificarse aún más al gusto.
Respuesta2
Los siguientes párrafos describen la idea en general y están desactualizados en algunos aspectos, pero puede usar la última versión deestepágina. Usemos un archivo grande ~/.bash_history.archive (separado de HISTFILE=~/.bash_history). Y luego, al salir de cada sesión de bash, agreguemos nuevas líneas de historial.
El primer problema con este enfoque fue: ¿cómo hacer que bash llame a este script en cada salida? Claro, si sales escribiendo 'salir', entonces puedes usar un alias de la función 'salir', pero uso el atajo Ctrl-D para eso y no pude encontrar una manera de reasignarlo a algo que no sea la función de salida incorporada.
Entonces el primer intento fue: prohibir Ctrl-D mediante
export IGNOREEOF=10
y defina una combinación doble Ctrl-X para llamar a la función de salida.
Pero el enfoque correcto es usar exit tramp de bash, que es una solución perfecta porque se llama independientemente de la forma en que salga de bash: Ctrl-D, salir, cerrar ventana xterm.
trap 'archive_history' EXIT
El siguiente paso es definir una línea de inicio en nuestro bash_history para que podamos guardar solo líneas nuevas y asegurarnos de agregarlas a un archivo de historial.
export CURBASHSTART=`grep -v "^[ \t]*$" $HISTFILE | wc -l | awk '{print $1}'` CURBASHDATE=`date`
shopt -s cmdhist histappend
Eso es todo lo que necesitamos al inicio del bash: ahora sabemos desde qué línea del historial comienza el historial actual (nuevo). Para guardar el historial, agregue la siguiente pieza a su ~/.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
}
El archivo ~/.inputrc debe contener las siguientes líneas para redefinir el acceso directo de salida a Ctrl-x x. En un primer intento puedes sentir que es un atajo terrible, pero luego te acostumbras, créeme.
$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
Además, si su sesión de bash es una sesión de inicio de sesión y sale llamando a " logout
", entonces puede agregar la siguiente línea a su~/.bash_logout
archive_history
Una vez realizadas todas las acciones mencionadas, podrá encontrar su ~/.bash_history.archive
archivo que contiene secciones como estas
#-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
que en general se puede leer como un archivo histórico habitual si lo desea.