Para evitar el registro de comandos "peligrosos" en el historial de bash, he agregado la siguiente línea a mi .bashrc
archivo:
HISTIGNORE='rm *:mv *:cp *:cat*>*:pv*>*'
esto funciona bien, pero tiene un efecto secundario: no puedo ver el historial completo de los comandos ejecutados en una máquina. Digamos que tengo varias máquinas para experimentos, y quiero poder ver todos los comandos ejecutados. Usaría bash internal history
para mostrar los comandos ejecutados, y quizás grep para la fecha de hoy:
history | grep Sep-28
Lo que me gustaría tener también es registrar comandos "peligrosos", pero poner un #
al principio de la línea, de modo que si ejecuto el comando desde el historial por error, no se producirá ningún daño.
No tengo idea si esto es posible.
Actualización y aclaración:
La razón principal por la que esto es un problema para mí es que generalmente estoy conectado a mi máquina desde varios terminales, y cualquier comando ejecutado en un terminal se lee inmediatamente en el historial de otros terminales. Esto se logra mediante
PROMPT_COMMAND="history -a; history -c; history -r"
Imaginemos que tengo dos terminales abiertas. En uno tengo algún cat /dev/foo > file.out
proceso en ejecución. En el segundo, verifico el progreso con ls -lAhF
. Sigo repitiendo ls
presionando Upy ENTER(es decir, el último comando del historial). Tan pronto como termina el primer comando, el último comando del historial ya no es ls
, pero cat /dev/foo > file.out
. Si no tengo cuidado, volveré a iniciar cat y sobrescribiré file.out.
Lo que me gustaría lograr es que el comando cat esté precedido por un #
, para que no se ejecute. Sin embargo, todavía lo vería en la historia y puedo reutilizarlo (si es un comando largo) al descomentarlo.
fuente
watch ls -lAhF
owhile sleep 1; do ls -lAhf; done
; en lugar de ver el tamaño del archivo, puede usarpv /dev/foo > file.out
( ivarch.com/programs/pv.shtml ).Respuestas:
Podrías hacer algo como:
La idea es que antes de cada solicitud, verifiquemos la última entrada del historial (
history 1
) y, si es una de las más peligrosas , la eliminemos (history -d
) y la agreguemos de nuevo con un#
conhistory -s
.(obviamente, debe eliminar su
HISTIGNORE
configuración).Un efecto secundario no deseado de que aunque es que altera el tiempo de la historia de los que
rm
,mv
... comandos.Para arreglar eso, una alternativa podría ser:
Esta vez, registramos la hora del último historial y, para volver a agregar la línea del historial, utilizamos
history -r
un archivo temporal (el documento aquí) que incluye la marca de tiempo.Desea
fixhist
que se realice antes de suhistory -a; history -c; history -r
. Desafortunadamente, la versión actual debash
tiene un error quehistory -a
no guarda esa línea adicional que hemos agregado. Una solución es escribirlo en su lugar:Es agregar el comando comentado al HISTFILE nosotros mismos en lugar de dejar
history -a
que lo hagamos.fuente
cmd=${cmd#*[0-9] }
hace? ¿Y dónde exactamente debo ponerfixhist
miPROMPT_COMMAND
? Por el momento, ya contienePROMPT_COMMAND="history -a; history -c; history -r"
HISTTIMEFORMAT=/
? Ya me he puestoexport HISTTIMEFORMAT="%b-%d %H:%M "
. Por cierto, cuando agrego su código en mi$HOME/.bashrc
, no pasa nada.HISTTIMEFORMAT=/
es solo para esa invocación dehistory
obtener una salida como123 /rm x
donde es más fácil extraer el cmd. Hubo un problema con algunas versiones debash
donde$HISTCMD
era falso en ese contexto, pruebe la nueva versión.#
el código no actúa como comentarios.bashrc
?bash
inserta un*
después del número de historial que no se esperaba. Debería arreglarse ahora.No voy a responder exactamente su pregunta, pero tal vez le dé una solución alternativa a su problema.
Si entiendo correctamente, le preocupan los errores que podría cometer escribiendo, por ejemplo,
!rm
si sucedió que elrm
comando anterior en el historial elimina algo que le gustaría conservar.En este caso, una buena opción bash es
histverify
. Si ustedshopt -s histverify
, y recuerda un comando con la explosión!
, no se ejecutará inmediatamente, sino que se cargará en la línea de lectura para que pueda decidir ejecutarlo o no, y esto también le brinda la posibilidad de editarlo.Intentalo:
Sin
histverify
:Con
histverify
:En este caso, tendrá el cursor al final de la línea, listo para iniciarlo nuevamente, o no, o editarlo.
Si te gusta esta opción, ponla en tu
.bashrc
:fuente