Менеджер паролей, созданный только с помощью bash 2
Здравствуйте, я бездарь.
Есть такой удобный .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
Механизм описан здесь, а остальное — это просто использование уже представленных вспомогательных функций.
До свидания. До новых встреч.