- #!/bin/bash
- input_name()
- {
- if [ "$#" = "1" ]; then
- name="$1"
- return 0
- fi
- printf "请输入名称:"
- read -r name
- if [ -z "$name" ]; then
- echo "名称不能为空!"
- return 1
- fi
- printf "%s" "$name" | grep '[[:punct:]]' >/dev/null 2>&1
- if [ "$?" -ne "1" ]; then
- echo "名称不能包含标点符号!"
- return 1
- fi
- return 0
- }
- get_name()
- {
- if [ "$#" = "0" ]; then
- OLD_IFS="$IFS"
- IFS='
- '
- select opt in `list`
- do
- if [ -n "$opt" ]; then
- name="$opt"
- IFS="$OLD_IFS"
- return 0
- else
- echo "操作取消"
- IFS="$OLD_IFS"
- return 1
- fi
- done
- IFS="$OLD_IFS"
- else
- name="$1"
- return 0
- fi
- return 1
- }
- create()
- {
- input_name "$@" || return 1
- show "$name" > /dev/null
- if [ "$?" = "0" ]; then
- echo "密码项 $name 已经存在!"
- return 1
- fi
- printf "%s 的值:" "$name"
- read -r -s value
- content=`printf "%s\\n%s" "$name: $value" "$content"`
- echo
- }
- delete()
- {
- get_name "$@" || return 1
- # 删除空行
- name=`printf "%s" "$name" | sed '/^$/d'`
- content=`printf "%s" "$content" | sed -e "/^$name:/d"`
- }
- update()
- {
- get_name "$@" || return 1
- delete "$name"
- create "$name"
- }
- show()
- {
- get_name "$@" || return 1
- printf "%s" "$content" | grep "^$name:"
- }
- list()
- {
- printf "%s" "$content" | sed -e "s/:.*$//g"
- }
- save()
- {
- printf "%s" "$content" | openssl aes-256-cbc -salt -pass env:wallet_token -out "$wallet_file"
- }
- change_password()
- {
- printf "请输入当前的密码:"
- read -r -s token
- if [ "$token" != "$wallet_token" ]; then
- printf "\\n密码错误!\\n"
- return 1
- fi
- printf "\\n请输入新密码:"
- read -r -s new_token
- printf "\\n请确认新密码:"
- read -r -s token
- if [ "$token" != "$new_token" ]; then
- printf "\\n两次输入的密码不一致!\\n"
- return 1
- fi
- wallet_token="$new_token"
- printf "\\n修改密码成功!\\n"
- return 0
- }
- usage()
- {
- echo '基于 openssl 的密码管理脚本(bash)'
- echo '命令: new, rm, update, show, passwd, quit'
- }
- if [ "$#" -gt "1" ]; then
- echo "格式:$0 [<钱包文件路径>]"
- echo
- exit 1
- elif [ "$#" -eq "1" ]; then
- wallet_file="$1"
- else
- wallet_file="$HOME/.wallet-default"
- fi
- if [ -f "$wallet_file" ]; then
- printf "请输入钱包密码:"
- read -r -s wallet_token
- export wallet_token
- content=`openssl aes-256-cbc -d -salt -pass \\
- env:wallet_token -in "$wallet_file"`
- if [ "$?" != "0" ]; then
- echo '解密失败!'
- exit 1
- fi
- else
- printf "钱包不存在,需要创建一个钱包\\n"
- printf "请输入钱包的密码:"
- read -r -s wallet_token
- echo
- export wallet_token
- if [ -z "$wallet_token" ]; then
- echo "密码不能为空"
- exit 1
- fi
- printf "再次输入以确认密码:"
- read -r -s token
- echo
- if [ "$wallet_token" != "$token" ]; then
- echo "两次输入的密码不一致!"
- exit 1
- fi
- content=""
- unset token
- fi
- trap "" INT
- echo
- usage
- while true
- do
- printf "\\nwallet> "
- read cmd
- case "$cmd" in
- "new" ) create ;;
- "rm" ) delete ;;
- "update" ) update ;;
- "show" ) show ;;
- "passwd" ) change_password ;;
- "" ) clear; usage ;;
- "quit" )
- echo; save
- content=""; export wallet_token=""; exit 0
- ;;
- * ) printf "无效命令:%s\\n" "$cmd"; usage ;;
- esac
- done
- #该片段来自于http://www.codesnippet.cn/detail/200620134188.html
来源: http://www.codesnippet.cn/detail/200620134188.html