只用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