Gerenciador de senhas feito apenas com bash 2

6 min

language: ja bn en es hi pt ru zh-cn zh-tw

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.

Related Posts