Gerenciador de senhas feito apenas com bash 2
Olá, sou um inútil.
Não existe um .bashrc tão conveniente como este?
_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
(Encontrei em algum lugar antes e copiei)
Então, pensei que este comando embutido conveniente do bash é super útil! e tentei incorporá-lo no gerenciador de senhas que criei.
Mais do que querer criar um gerenciador de senhas, eu só queria usar o complete.
GitHub - haturatu/ppbash: Gerador e gerenciador de senhas 'ore-ore' (meu próprio) feito apenas com bash
Explicação
_usage
É uma função interna e uma função auxiliar usada quando nenhum argumento é passado. Eu apenas a tornei reutilizável mesmo que o número de comandos de geração de senha executáveis aumente.
_usage() {
local pass_func="$1"
local phrase="$2"
local filename="$3"
if [[ -z "$filename" ]]; then
echo "Usage: $pass_func <filename> <phrase>"
echo
echo "Descrição:"
echo " $pass_func gera uma senha a partir da <phrase> especificada,"
echo " e a salva criptografada como <filename> em ~/.${pass_func}/."
echo
echo "Argumentos:"
echo " <filename> : Nome de identificação (nome do arquivo) usado para salvar/carregar"
echo " <phrase> : Frase original (coloque entre aspas se contiver espaços)"
echo
echo "Exemplo de uso:"
echo " $pass_func mymail 'Like a rolling stone'"
echo
echo "Reutilização:"
echo " Se você especificar um <filename> já salvo, a senha será exibida novamente."
echo
echo "Autocompletar:"
echo " Ao digitar ${pass_func} <Tab>, os nomes de arquivo salvos serão autocompletados."
echo
echo "Comandos relacionados:"
echo " ppmenu : Lista os diretórios de senhas registrados."
echo
return 1
fi
return 0
}
_init_pass_dir
Pensei se seria realmente necessário escrever isso, mas como seria redundante, criei esta função auxiliar também.
_init_pass_dir() {
local dir=$1
if [[ ! -d $dir ]]; then
mkdir -p $dir
fi
}
_pass_list
Armazena os arquivos para autocompletar, que são passados para complete, em um array.printf "%s " "${passfiles[@]##*/}" lista apenas os nomes de arquivo de um array de caminhos completos.
É como awk, mas, por exemplo, se for /uoo/ooo/genki, ele se torna apenas genki.
_pass_list() {
local dir="$1"
local passfiles=()
if [[ -d "$dir" ]]; then
passfiles=("$dir"/*)
printf "%s " "${passfiles[@]##*/}"
fi
}
_register_func_dir
É um pouco complicado, talvez eu devesse corrigir o nome da função...
As funções são armazenadas em um array.
Com declare -F , extraímos as funções definidas no bash que começam com pb.
E as armazenamos no array PASS_DIRS.
Depois disso, complete -W permite que palavras separadas por espaço sejam autocompletadas quando a função $fn é digitada.
_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')
}
Acho que complete -F é mais versátil que complete -W.
Isso porque, ao autocompletar, ele executa uma função para gerar dinamicamente.
Enquanto -W autocompleta a partir de valores estáticos, no caso do autocompletar de ssh que vimos no início,
_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
Se você pressionar Tab depois de ssh, _ssh_hosts será executado.
Provavelmente, meu eu futuro fará com que seja possível autocompletar com complete -F mais tarde...
As funções restantes de geração de senha não são muito interessantes, então ficamos por aqui.
【Nojento】 Gerenciador de senhas que pode ser feito apenas com .bashrc - SOULMINIGRIG
O mecanismo está escrito por aqui, e o resto é basicamente apenas o uso das funções auxiliares já introduzidas.
Até a próxima. Conto com vocês.