只用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
在ssh之后按下Tab键,_ssh_hosts就会执行。
也许未来的我会在之后用complete -F来实现补全...
剩下的密码生成函数系列没什么意思,所以就到这里。
【令人不适】只用.bashrc就能实现的密码管理器 - SOULMINIGRIG
机制写在这里,其余的基本上只是使用了前面介绍的辅助函数。
那么,下次再见。请多关照。