只用bash製作的密碼管理器2

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

Related Posts