Gestor de contraseñas hecho solo con bash 2
Hola, soy un incompetente.
¿Sabes? Existe este práctico .bashrc, ¿verdad?
_ssh_hosts() {
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -W "$(awk '{print $1}' ~/.ssh/known_hosts | cut -d, -f1 | sort -u)" -- "$cur") )
}
complete -F _ssh_hosts ssh
(Lo encontré en algún lugar antes y lo copié)
Así que, pensé que este práctico comando incorporado de bash es súper útil. ¡Y lo incorporé en un gestor de contraseñas que hice yo mismo!
Más que querer crear un gestor de contraseñas, solo quería usar complete.
GitHub - haturatu/ppbash: Generador y gestor de contraseñas propio hecho solo con bash
Explicación
_usage
Es una función interna, una función auxiliar, que se utiliza cuando no se pasan argumentos. Simplemente la hice reutilizable incluso si se añaden más comandos de generación de contraseñas.
_usage() {
local pass_func="$1"
local phrase="$2"
local filename="$3"
if [[ -z "$filename" ]]; then
echo "Usage: $pass_func <filename> <phrase>"
echo
echo "Descripción:"
echo " $pass_func genera una contraseña a partir de la <phrase> especificada,"
echo " y la guarda en ~/.${pass_func}/ con el nombre <filename> de forma encriptada."
echo
echo "Argumentos:"
echo " <filename> : Nombre identificador (nombre de archivo) para guardar/cargar"
echo " <phrase> : Frase original (encerrar entre comillas si contiene espacios)"
echo
echo "Ejemplo de uso:"
echo " $pass_func mymail 'Like a rolling stone'"
echo
echo "Reutilización:"
echo " Si especifica un <filename> ya guardado, se mostrará esa contraseña de nuevo."
echo
echo "Autocompletado:"
echo " Los nombres de archivo guardados se autocompletarán con ${pass_func} <Tab>."
echo
echo "Comandos relacionados:"
echo " ppmenu : Lista los directorios de contraseñas registrados."
echo
return 1
fi
return 0
}
_init_pass_dir
Me pregunté si era necesario escribirlo específicamente, pero para evitar la redundancia, también creé esta función auxiliar.
_init_pass_dir() {
local dir=$1
if [[ ! -d $dir ]]; then
mkdir -p $dir
fi
}
_pass_list
Almacena los archivos de autocompletado que se pasarán a complete en un array.printf "%s " "${passfiles[@]##*/}" lista solo los nombres de archivo de un array de rutas completas.
Es algo similar a awk, pero por ejemplo, si es /uoo/ooo/genki, solo será genki.
_pass_list() {
local dir="$1"
local passfiles=()
if [[ -d "$dir" ]]; then
passfiles=("$dir"/*)
printf "%s " "${passfiles[@]##*/}"
fi
}
_register_func_dir
Es un poco complicado, así que quizás debería corregir el nombre de la función...
Las funciones se almacenan en un array.
Extrae las funciones que comienzan con pb de las definidas en bash usando declare -F .
Y las almacena en el array PASS_DIRS.
Después de eso, complete -W permite el autocompletado de palabras separadas por espacios cuando se introduce la función $fn.
_register_func_dir() {
while read -r fn _; do
local dir="$HOME/.$fn"
PASS_DIRS+=("$dir")
complete -W "$(_pass_list "$dir")" "$fn"
done < <(declare -F | awk '{print $3}' | grep '^pb')
}
Creo que complete -F es más versátil que complete -W.
Esto se debe a que genera dinámicamente las sugerencias ejecutando una función.-W completa a partir de valores estáticos, pero para el autocompletado de ssh mencionado al principio,
_ssh_hosts() {
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -W "$(awk '{print $1}' ~/.ssh/known_hosts | cut -d, -f1 | sort -u)" -- "$cur") )
}
complete -F _ssh_hosts ssh
Si presionas Tab después de ssh, se ejecutará _ssh_hosts.
Probablemente mi yo del futuro lo hará para que se pueda autocompletar con complete -F más tarde...
El resto de las funciones de generación de contraseñas no son muy interesantes, así que hasta aquí.
[Inquietante] Gestor de contraseñas que se puede hacer solo con .bashrc - SOULMINIGRIG
El mecanismo está escrito por aquí, y básicamente, solo utiliza las funciones auxiliares ya presentadas.
Hasta la próxima. Saludos.