150 lines
4.1 KiB
Bash
150 lines
4.1 KiB
Bash
#!/bin/bash
|
||
# vaultwarden搜索测试脚本
|
||
# 用于验证通过item名称查找凭证的概念
|
||
|
||
set -e
|
||
|
||
echo "🔍 vaultwarden凭证搜索测试"
|
||
echo "================================"
|
||
|
||
# 检查Bitwarden CLI是否安装
|
||
if ! command -v bw &> /dev/null; then
|
||
echo "❌ Bitwarden CLI (bw) 未安装"
|
||
echo "安装命令: brew install bitwarden-cli"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查jq是否安装(用于JSON解析)
|
||
if ! command -v jq &> /dev/null; then
|
||
echo "❌ jq 未安装"
|
||
echo "安装命令: brew install jq"
|
||
exit 1
|
||
fi
|
||
|
||
# 显示当前配置
|
||
echo "📊 当前Bitwarden CLI配置:"
|
||
bw status
|
||
|
||
echo ""
|
||
echo "📝 测试流程说明:"
|
||
echo "1. 配置连接到vaultwarden服务器"
|
||
echo "2. 使用API密钥登录"
|
||
echo "3. 搜索指定名称的项目"
|
||
echo "4. 提取用户名和密码"
|
||
echo ""
|
||
|
||
# 配置vaultwarden服务器(如果未配置)
|
||
CURRENT_SERVER=$(bw config server | grep -o 'http://[^ ]*' || echo "")
|
||
if [ -z "$CURRENT_SERVER" ] || [ "$CURRENT_SERVER" != "http://localhost:8080" ]; then
|
||
echo "⚙️ 配置连接到vaultwarden服务器..."
|
||
bw config server http://localhost:8080
|
||
echo "✅ 服务器配置完成: http://localhost:8080"
|
||
fi
|
||
|
||
echo ""
|
||
echo "🔐 登录说明:"
|
||
echo "需要以下环境变量:"
|
||
echo " export BW_CLIENTID='你的客户端ID'"
|
||
echo " export BW_CLIENTSECRET='你的客户端密钥'"
|
||
echo ""
|
||
echo "然后运行: bw login --apikey"
|
||
echo ""
|
||
|
||
# 检查是否已登录
|
||
SESSION=$(bw status | jq -r '.session')
|
||
if [ -n "$SESSION" ] && [ "$SESSION" != "null" ]; then
|
||
echo "✅ 已登录,会话有效"
|
||
export BW_SESSION="$SESSION"
|
||
else
|
||
echo "⚠️ 未登录或会话无效"
|
||
echo "请先设置环境变量并登录"
|
||
exit 1
|
||
fi
|
||
|
||
# 测试搜索功能
|
||
echo ""
|
||
echo "🧪 测试搜索功能..."
|
||
echo ""
|
||
|
||
# 函数:搜索项目并显示凭证
|
||
search_vaultwarden_item() {
|
||
local item_name="$1"
|
||
|
||
echo "搜索项目: $item_name"
|
||
echo "--------------------------------"
|
||
|
||
# 搜索项目
|
||
ITEM_JSON=$(bw list items --search "$item_name" 2>/dev/null || echo "[]")
|
||
|
||
if [ "$ITEM_JSON" = "[]" ] || [ -z "$ITEM_JSON" ]; then
|
||
echo "❌ 未找到项目: $item_name"
|
||
return 1
|
||
fi
|
||
|
||
# 解析第一个项目
|
||
ITEM_COUNT=$(echo "$ITEM_JSON" | jq '. | length')
|
||
echo "找到 $ITEM_COUNT 个匹配项目"
|
||
|
||
# 显示每个项目的基本信息
|
||
for i in $(seq 0 $((ITEM_COUNT - 1))); do
|
||
ITEM=$(echo "$ITEM_JSON" | jq ".[$i]")
|
||
ITEM_ID=$(echo "$ITEM" | jq -r '.id')
|
||
ITEM_NAME=$(echo "$ITEM" | jq -r '.name')
|
||
ITEM_TYPE=$(echo "$ITEM" | jq -r '.type')
|
||
|
||
echo ""
|
||
echo "📋 项目 $((i+1)):"
|
||
echo " ID: $ITEM_ID"
|
||
echo " 名称: $ITEM_NAME"
|
||
echo " 类型: $ITEM_TYPE"
|
||
|
||
# 如果是登录类型,显示用户名
|
||
if [ "$ITEM_TYPE" = "1" ]; then
|
||
USERNAME=$(echo "$ITEM" | jq -r '.login.username // "未设置"')
|
||
echo " 用户名: $USERNAME"
|
||
|
||
# 注意:不直接显示密码,只显示是否有密码
|
||
HAS_PASSWORD=$(echo "$ITEM" | jq -r '.login.password != null')
|
||
if [ "$HAS_PASSWORD" = "true" ]; then
|
||
echo " 密码: [已设置]"
|
||
else
|
||
echo " 密码: [未设置]"
|
||
fi
|
||
fi
|
||
|
||
# 显示备注(如果有)
|
||
NOTES=$(echo "$ITEM" | jq -r '.notes // ""')
|
||
if [ -n "$NOTES" ] && [ "$NOTES" != "null" ]; then
|
||
echo " 备注: $NOTES"
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
echo "✅ 搜索完成"
|
||
return 0
|
||
}
|
||
|
||
# 如果提供了参数,测试搜索
|
||
if [ $# -ge 1 ]; then
|
||
search_vaultwarden_item "$1"
|
||
else
|
||
echo "📌 使用方法:"
|
||
echo " $0 <项目名称>"
|
||
echo ""
|
||
echo "示例:"
|
||
echo " $0 n8n"
|
||
echo " $0 mysql"
|
||
echo " $0 ssh"
|
||
fi
|
||
|
||
echo ""
|
||
echo "================================"
|
||
echo "测试脚本完成"
|
||
echo ""
|
||
echo "⚠️ 安全提醒:"
|
||
echo "1. 此脚本不在磁盘上存储任何密码"
|
||
echo "2. 密码只在内存中临时存在"
|
||
echo "3. 使用后请清理环境变量:"
|
||
echo " unset BW_SESSION"
|
||
echo " unset BW_CLIENTID"
|
||
echo " unset BW_CLIENTSECRET" |