只用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
這裡寫了它的機制,基本上只是使用了已經介紹過的輔助函數。
那麼下次再見。請多關照。