惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

www.infosecurity-magazine.com
www.infosecurity-magazine.com
V
V2EX
博客园 - 【当耐特】
爱范儿
爱范儿
B
Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
MyScale Blog
MyScale Blog
月光博客
月光博客
博客园_首页
G
Google Developers Blog
Recent Announcements
Recent Announcements
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
D
Docker
aimingoo的专栏
aimingoo的专栏
博客园 - Franky
有赞技术团队
有赞技术团队
I
InfoQ
小众软件
小众软件
云风的 BLOG
云风的 BLOG
The GitHub Blog
The GitHub Blog
H
Help Net Security
The Register - Security
The Register - Security
U
Unit 42
P
Palo Alto Networks Blog
N
News and Events Feed by Topic
酷 壳 – CoolShell
酷 壳 – CoolShell
C
CERT Recently Published Vulnerability Notes
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
Security Latest
Security Latest
Scott Helme
Scott Helme
罗磊的独立博客
B
Blog RSS Feed
C
Check Point Blog
H
Heimdal Security Blog
T
Threatpost
V
Visual Studio Blog
V
Vulnerabilities – Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Project Zero
Project Zero
Security Archives - TechRepublic
Security Archives - TechRepublic
S
Security Affairs
S
Schneier on Security
Apple Machine Learning Research
Apple Machine Learning Research
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
Attack and Defense Labs
Attack and Defense Labs
L
Lohrmann on Cybersecurity
D
DataBreaches.Net

轶哥博客

blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog blog
blog
2023-03-23 · via 轶哥博客

随着时间的推移,1Password中的记录可能会出现重复(其实是1Password老版本的BUG导致的)。这些重复记录可能会导致混乱,并增加在查找需要的凭据时的困难。为了解决这个问题,我们创建了一个用于查找并删除重复项的Python脚本。

脚本概述

该脚本首先获取所有重复的title,然后提取相关的ID。接着,脚本通过比较Fields和URLs部分,找到重复的项目并将多余的项目ID添加到一个列表中。最后,根据需要,您可以选择删除多余的项目。

使用方法

  1. 确保已安装Python 3,并确保1Password CLI(命令行界面)已经正确配置。
  2. 保存以下脚本到名为 1password_deduplicate.py 的文件中。
  3. 在终端中,导航到包含脚本的文件夹,然后运行 python 1password_deduplicate.py
  4. 脚本将显示需要删除的额外项目ID。如需删除这些项目,请取消脚本末尾相关行的注释,并重新运行脚本。

脚本代码

已同步到https://gist.github.com/yi-ge/7ac4563874f67d88140a8526a4ec2c82

import os
import re
import time
import pickle
import subprocess
from collections import defaultdict


def run_command(command, error_msg=None, show_output=True):
    try:
        output = subprocess.check_output(
            command, shell=True, text=True, stderr=subprocess.STDOUT)
        return output
    except subprocess.CalledProcessError as e:
        if error_msg:
            print(error_msg)
        if show_output:
            print(e.output)
        if ": EOF" in e.output:
            print('出错了,正在重试...')
            return run_command(command, error_msg, True)
        return e.output


def extract_fields_and_urls(detail):
    fields_start = detail.find("Fields:")
    urls_start = detail.find("URLs:")
    return detail[fields_start:urls_start]


# 获取重复的title列表
print("正在获取重复的title列表...")
command = "op item list | awk '{print $2}' | sort | uniq -d"
duplicated_titles = run_command(command).splitlines()

# 提取ID的正则表达式
id_pattern = re.compile(r'\b[a-zA-Z0-9]{26}\b')

# 存储每个title的详细信息
if os.path.exists('cache.pkl'):
    # 从文件中加载变量
    with open('cache.pkl', 'rb') as f:
        title_details = pickle.load(f)
else:
    # 计算新的变量title_details并将其写入文件
    title_details = defaultdict(list)
    with open('cache.pkl', 'wb') as f:
        pickle.dump(title_details, f)

times = 0

# 获取所有重复title的详细信息
print("正在获取所有重复title的详细信息...")
for title in duplicated_titles:
    error_msg = f"在尝试获取title \"{title}\" 的详细信息。"
    output = run_command(f"op item get {title}", error_msg, False)
    ids = id_pattern.findall(output)

    for item_id in ids:
        if any(d['id'] == item_id for d in title_details[title]):
            continue  # 如果已经存在该id对应的信息,则跳过
        error_msg = f"在尝试获取ID \"{item_id}\" 的详细信息时发生错误。。"
        item_info = run_command(f"op item get {item_id}", error_msg)
        print(item_info)
        title_details[title].append({'id': item_id, 'info': item_info})
        # 将变量title_details写入文件
        with open('cache.pkl', 'wb') as f:
            pickle.dump(title_details, f)

    times += 1
    if times % 10 == 0:
        print(f"已完成{times}个title的处理。")

# 检查重复项目并保留一条数据
extra_items = []

print("正在检查重复项目并保留一条数据...")
for title, details in title_details.items():
    unique_items = []

    for detail in details:
        fields_and_urls = extract_fields_and_urls(detail['info'])
        if fields_and_urls not in unique_items:
            unique_items.append(fields_and_urls)
        else:
            item_id = id_pattern.search(detail['info']).group()
            extra_items.append(item_id)

print("\n需要删除的额外项目ID:")
for item_id in extra_items:
    print(item_id)

# 根据需要,可以执行以下操作删除多余的项目
for item_id in extra_items:
    error_msg = f"删除 \"{item_id}\" 出现异常。"
    out = run_command(f"op item delete {item_id}", error_msg)
    print(out)

print('去重完成!')

正则表达式

在这个脚本中,我们使用正则表达式来匹配和提取项目ID。这种方法在处理文本数据时非常有效,可以帮助我们快速准确地找到所需信息。

注意事项

  1. 在使用此脚本之前,请确保已经正确安装并配置了1Password CLI。具体信息和安装说明,请参阅官方文档
  2. 脚本默认仅显示需要删除的项目ID。如需实际删除这些项目,请在脚本末尾取消注释,然后重新运行脚本。请注意,删除操作不可逆,因此在执行之前,请确保您已备份相关数据。
  3. 请确保在使用此脚本时已登录1Password账户。如果尚未登录,请在命令行中运行 op signin 命令并按照提示进行操作。

总结

本文介绍了一个名为《1Password去重脚本》的Python脚本。这个脚本可以帮助用户找出1Password中的重复项,并在确认后删除它们。通过使用这个脚本,您可以更轻松地管理1Password中的记录,从而提高工作效率和安全性。

注意: 代码由AI编写,人工测试及完善,脚本运行速度受限于1Password交互速度,整体比较慢。脚本会自动处理错误信息,出现网络错误提示不用担心会自动重试,如果不幸退出了脚本,再次执行脚本会自动执行未完成的任务。请执行删除前备份好数据,任何误删导致的数据丢失,本人及AI概不负责。(如果不幸直接删除了数据,30天内在GUI中的“最近删除”还有最后一次抢救机会)