Muchas veces lanzamos scripts con algún que otro parámetro que puede contener información sensible. Por ejemplo, puede ser una contraseña, un usuario o una cadena de conexión. El historial de la terminal recuerda toda la actividad de un determinado usuario. Tendremos que ser nosotros quienes apliquemos sentido común para mantener la seguridad del sistema. Pongamos como ejemplo un script para conectar con una BBDD MySQL de la siguiente manera:
#!/bin/bash user=$1 pass=$2 # Show databases mysql -u “$user” -p“$pass” -e 'show databases;' ...
Para llamar a este script realizaríamos normalmente lo siguiente, considerando como hemos visto que el primer parámetro $1
es el usuario y el segundo $2
es la contraseña:
./testscript.sh max M19aSS
El problema tras lanzarlo es que si hacemos un history
encontramos como es obvio la entrada correspondiente:
… 1013 04/06/16 12:47:44 ./testscript.sh max M19aSS …
Como vemos, se muestra el comando que hemos lanzado revelando la contraseña en claro. Por razones de seguridad, esto no es muy buena idea… Para evitarlo, podríamos añadir la siguiente línea al final del script:
history -d $( history | awk '{print $1}' | tail -1 )
Después tendremos que ejecutar el script con el comando source
. La razón es que cuando invocamos un script típicamente con ./mi_script.sh
, se crea una nueva shell en la que ejecutarlo. El historial de esa shell invocada es independiente del de la shell “padre”, por lo que recibiríamos el siguiente error:
./testscript.sh: line 10: history: -d: option requires an argument history: usage: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]
Precisamente porque history | awk '{print $1}' | tail -1
no es capaz de encontrar ninguna entrada. Como la entrada del historial que queremos borrar pertenece a nuestro usuario, lo que haremos será lanzar el script con source
(que no invoca otra shell) como decía anteriormente:
source testscript.sh max M19aSS
Si ahora buscáramos con history
, no deberíamos ver ninguna entrada correspondiente a la acción anterior.
Otra opción temporal consiste en deshabilitar temporalmente el historial antes de lanzar nuestro script:
set +o history
Una vez lanzado, podemos volver a habilitarlo con:
set -o history
Por supuesto, la opción más sencilla de todas es borrar la línea específica del historial una vez ejecutado nuestro script para no dejar a la vista información sensible que pueda comprometer la seguridad del sistema:
history -d [numerolinea]
Sin embargo, los métodos anteriores, una vez automatizados creo que resultan más cómodos y evitan despistes que en el día a día se puedan fácilmente cometer.