golang跨工作站S3存储剪贴板同步插件copy-pasta的使用

Golang跨工作站S3存储剪贴板同步插件copy-pasta的使用

Build Status

如何使用

单行内容

在一台机器上复制内容:

echo "I don't like ravioli" | copy-pasta

在另一台机器上粘贴:

copy-pasta

输出结果:

I don't like ravioli

多行内容/文件

复制文件内容:

cat myPenne.jpg | copy-pasta

在另一台机器上粘贴到文件:

copy-pasta > myPenne.jpg

多用户支持

如果你与他人共享机器或需要多个剪贴板,可以使用--target选项:

copy-pasta login --target your-copy-pasta
<输入你的S3 ACCESSKEY>
<输入你的S3 SECRETACCESSKEY>

然后切换目标:

copy-pasta target your-copy-pasta

工作原理

工作原理图

机器与存储服务器之间的通信使用SSL加密。复制到copy-pasta的内容以明文形式存储在存储服务器上。

安装

使用Go安装

go get github.com/jutkko/copy-pasta

使用Homebrew安装

brew tap jutkko/homebrew-copy-pasta
brew install copy-pasta

登录配置

copy-pasta login --target my-copy-pasta
<输入你的S3 ACCESSKEY>
<输入你的S3 SECRETACCESSKEY>

完整示例

Bash脚本示例

非交互式登录:

printf "%s\n%s\n" "$ACCESSKEY" "$SECRETACCESSKEY" | copy-pasta login --target my-target

粘贴到系统剪贴板:

#!/bin/bash
copy-pasta-to-pbcopy() {
  copy-pasta | pbcopy
}

从系统剪贴板复制:

#!/bin/bash
pbpaste-to-copy-pasta() {
  pbpaste | copy-pasta
}

卸载

使用Go安装的卸载方式

rm -rf $GOPATH/src/github.com/jutkko/copy-pasta
rm $GOPATH/bin/copy-pasta

使用Homebrew安装的卸载方式

brew uninstall copy-pasta
brew untap homebrew-copy-pasta

删除配置文件:

rm ~/.copy-pastarc

运行测试

cd $GOPATH/src/github.com/jutkko/copy-pasta
go get github.com/onsi/ginkgo
go get github.com/onsi/gomega
ginkgo -r

更多关于golang跨工作站S3存储剪贴板同步插件copy-pasta的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang跨工作站S3存储剪贴板同步插件copy-pasta的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang 跨工作站 S3 存储剪贴板同步插件 Copy-Pasta 使用指南

Copy-Pasta 是一个使用 Golang 开发的跨工作站剪贴板同步工具,利用 S3 存储作为中转站实现剪贴板内容的同步。下面我将详细介绍其使用方法和实现原理。

基本概念

Copy-Pasta 的工作原理:

  1. 将本地剪贴板内容上传到 S3 存储桶
  2. 其他工作站定期检查 S3 存储桶并下载最新剪贴板内容
  3. 将下载的内容设置到本地剪贴板

安装方法

go get github.com/yourusername/copy-pasta

配置 S3 凭证

首先需要创建配置文件 ~/.copy-pasta/config.yaml

aws:
  access_key_id: YOUR_ACCESS_KEY
  secret_access_key: YOUR_SECRET_KEY
  region: us-east-1
  bucket: your-bucket-name

基本使用示例

package main

import (
	"fmt"
	"log"
	"github.com/yourusername/copy-pasta/clipboard"
	"github.com/yourusername/copy-pasta/storage"
)

func main() {
	// 初始化 S3 存储
	s3Store, err := storage.NewS3Storage("your-bucket-name", "us-east-1")
	if err != nil {
		log.Fatal(err)
	}

	// 从剪贴板读取
	content, err := clipboard.Read()
	if err != nil {
		log.Fatal(err)
	}

	// 上传到 S3
	err = s3Store.Upload("clipboard/latest", content)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("剪贴板内容已同步到云端")
}

完整实现示例

以下是一个完整的剪贴板同步守护程序实现:

package main

import (
	"log"
	"time"
	
	"github.com/yourusername/copy-pasta/clipboard"
	"github.com/yourusername/copy-pasta/storage"
)

func main() {
	// 初始化存储
	store, err := storage.NewS3StorageFromConfig()
	if err != nil {
		log.Fatal("初始化存储失败:", err)
	}

	// 上一次的剪贴板内容哈希
	var lastHash string

	// 启动同步循环
	ticker := time.NewTicker(5 * time.Second)
	for range ticker.C {
		// 检查远程剪贴板更新
		remoteContent, err := store.Download("clipboard/latest")
		if err == nil {
			currentHash := hashContent(remoteContent)
			if currentHash != lastHash {
				// 设置到本地剪贴板
				err = clipboard.Write(remoteContent)
				if err != nil {
					log.Println("设置剪贴板失败:", err)
				} else {
					lastHash = currentHash
					log.Println("剪贴板已从云端更新")
				}
			}
		}

		// 上传本地剪贴板变更
		localContent, err := clipboard.Read()
		if err != nil {
			log.Println("读取剪贴板失败:", err)
			continue
		}

		currentHash := hashContent(localContent)
		if currentHash != lastHash {
			err = store.Upload("clipboard/latest", localContent)
			if err != nil {
				log.Println("上传剪贴板失败:", err)
			} else {
				lastHash = currentHash
				log.Println("剪贴板已上传到云端")
			}
		}
	}
}

func hashContent(content []byte) string {
	// 简单实现,实际应用中应该使用更安全的哈希算法
	return fmt.Sprintf("%x", md5.Sum(content))
}

高级功能实现

1. 剪贴板历史记录

// 保存历史记录
func saveHistory(store storage.Storage, content []byte) error {
	timestamp := time.Now().Format("2006-01-02-15-04-05")
	key := fmt.Sprintf("clipboard/history/%s", timestamp)
	return store.Upload(key, content)
}

// 获取历史记录列表
func listHistory(store storage.Storage) ([]string, error) {
	return store.ListObjects("clipboard/history/")
}

2. 多设备同步冲突解决

// 使用乐观锁解决冲突
func syncWithConflictResolution(store storage.Storage) error {
	// 获取远程元数据
	remoteMeta, err := store.GetMetadata("clipboard/latest")
	if err != nil {
		return err
	}

	// 获取本地剪贴板
	localContent, err := clipboard.Read()
	if err != nil {
		return err
	}

	// 比较时间戳
	remoteTime := remoteMeta.LastModified
	localTime := getLastClipboardChangeTime()
	
	if remoteTime.After(localTime) {
		// 远程更新,下载内容
		content, err := store.Download("clipboard/latest")
		if err != nil {
			return err
		}
		return clipboard.Write(content)
	} else if remoteTime.Before(localTime) {
		// 本地更新,上传内容
		return store.Upload("clipboard/latest", localContent)
	}
	
	return nil
}

部署建议

  1. 将程序打包为系统服务(systemd 或 launchd)
  2. 设置适当的 AWS IAM 权限,最小权限原则
  3. 启用 S3 版本控制以便恢复历史记录
  4. 考虑添加端到端加密保护敏感剪贴板内容

注意事项

  1. 剪贴板可能包含敏感信息,确保 S3 存储桶有适当的安全设置
  2. 频繁同步可能产生 S3 API 费用
  3. 大文件剪贴板内容可能需要分块上传

通过以上实现,Copy-Pasta 可以成为一个高效的跨工作站剪贴板同步解决方案。根据实际需求,可以进一步扩展功能,如图片剪贴板支持、选择性同步等。

回到顶部