Менеджер паролей, созданный только с помощью bash 2

6 min

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

Здравствуйте, я бездарь.
Есть такой удобный .bashrc, не так ли?

_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

(Нашел где-то раньше и скопировал)

Поэтому я подумал, что эта удобная встроенная команда bash очень полезна! и попробовал встроить ее в свой собственный менеджер паролей.
Я хотел использовать complete, а не столько создать менеджер паролей.
GitHub - haturatu/ppbash: Мой собственный генератор и менеджер паролей, сделанный только с помощью bash

Описание

_usage

Это внутренняя функция, которая вызывается, когда аргументы не передаются, и является вспомогательной функцией. Я просто сделал ее многоразовой, даже если количество команд для генерации паролей увеличится.

_usage() {
  local pass_func="$1"
  local phrase="$2"
  local filename="$3"

  if [[ -z "$filename" ]]; then
    echo "Usage: $pass_func <filename> <phrase>"
    echo
    echo "Описание:"
    echo "  $pass_func генерирует пароль из указанной <phrase>,"
    echo "  и сохраняет его зашифрованным под именем <filename> в ~/.${pass_func}/."
    echo
    echo "Аргументы:"
    echo "  <filename> : Идентификационное имя (имя файла) для сохранения/загрузки"
    echo "  <phrase>   : Исходная фраза (заключите в кавычки, если содержит пробелы)"
    echo
    echo "Пример использования:"
    echo "  $pass_func mymail 'Like a rolling stone'"
    echo
    echo "Повторное использование:"
    echo "  Если указать уже сохраненный <filename>, его пароль будет отображен снова."
    echo
    echo "Автодополнение:"
    echo "  При нажатии ${pass_func} <Tab> будут предложены сохраненные имена файлов."
    echo
    echo "Связанные команды:"
    echo "  ppmenu  : Отображает список зарегистрированных каталогов паролей."
    echo
    return 1
  fi

  return 0
}

_init_pass_dir

Я подумал, стоит ли это писать, но чтобы избежать избыточности, я также создал для этого вспомогательную функцию.

_init_pass_dir() {
  local dir=$1
  if [[ ! -d $dir ]]; then
    mkdir -p $dir
  fi
}

_pass_list

Файлы для автодополнения, передаваемые в complete, хранятся в массиве.
printf "%s " "${passfiles[@]##*/}" перечисляет только имена файлов из массива полных путей.
Это похоже на awk, но, например, для /uoo/ooo/genki останется только genki.

_pass_list() {
  local dir="$1"
  local passfiles=()

  if [[ -d "$dir" ]]; then
    passfiles=("$dir"/*)
    printf "%s " "${passfiles[@]##*/}"
  fi
}

_register_func_dir

Возможно, стоит изменить имя функции, потому что оно запутанное...

Функции будут храниться в массиве.
С помощью declare -F извлекаются функции, определенные в bash, которые начинаются с pb.
Они сохраняются в массиве PASS_DIRS.

После этого complete -W позволяет автодополнять слова, разделенные пробелами, при вводе функции $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')
}

Я думаю, что complete -F более универсален, чем complete -W.
Это потому, что при автодополнении функция выполняется для динамической генерации.
В то время как -W автодополняет из статических значений, при автодополнении ssh, которое было в начале,

_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

При нажатии Tab после ssh будет выполнена _ssh_hosts.
Вероятно, мое будущее я сделает так, чтобы автодополнение работало с complete -F позже...

Остальные функции генерации паролей не очень интересны, поэтому на этом все.
【Жуткий】 Менеджер паролей, который можно сделать только с помощью .bashrc - SOULMINIGRIG
Механизм описан здесь, а остальное — это просто использование уже представленных вспомогательных функций.
До свидания. До новых встреч.

Related Posts