lmaotrigine/klip

GitHub: lmaotrigine/klip

klip 是一款跨网络的命令行剪贴板工具,允许用户在不同主机间通过中转服务器安全地复制粘贴文本和文件。

Stars: 0 | Forks: 0

# klip 通过网络复制/粘贴任何内容。 ![klip](https://static.pigsec.cn/wp-content/uploads/repos/cas/0f/0f6938ed32dd7ee921710f06a930374c7fc75edc2b1714a1e4a894d48da24f57.svg) 曾经需要一个能在网络上共享的剪贴板吗? klip 可以在任意主机之间无缝传输 URL、代码片段、文档以及几乎所有其他内容。 无需 SSH,并且主机可以位于 NAT 网关之后或不同的网络中。 使用标准输入的任何内容来填充剪贴板("复制"): ``` $ echo "clipboard content" | klc ``` 在安装了 klip 且配置相同的任意主机上,神奇地获取该内容: ``` $ klp clipboard content ``` 显然,它也可以用于传输文件: ``` $ klc < kitty.gif $ klp > kittycopy.gif ``` ``` $ tar cvf - *.txt | klc $ klp | tar xvf - ``` 为了绕过防火墙/NAT 网关,剪贴板内容会通过中转服务器经由 TCP 进行传输。 没有端到端加密,就不会进行任何传输;服务器几乎无法获知剪贴板的实际内容。 数据可以在不同的操作系统之间共享,包括 macOS 和 Windows。 ## 安装 ### Homebrew klip 可以在我的 [homebrew tap](https://github.com/lmaotrigine/homebrew-tap) 中获取。 ``` $ brew tap lmaotrigine/tap $ brew install lmaotrigine/tap/klip ``` ### 预编译二进制文件 macOS、Linux 和 Windows 的预编译二进制文件可在此处下载: https://github.com/lmaotrigine/klip/releases。 ### 编译源代码 本项目使用纯 Rust 编写,包含部分用于 SIMD 加密加速的内联汇编,以及与操作系统交互的极简 FFI。 已知它可以在最新的稳定版编译器上构建。出于历史原因,在 curve25519 实现中启用 SIMD 优化需要 nightly 版本的编译器。未来这一限制可能会放宽。您的 SIMD 体验可能会有很大差异。我已经做了一些广泛的基准测试,但如果您发现影响性能的极端情况,请告诉我!使用以下任一命令进行构建: ``` $ cargo build --release --locked ``` 仅当您处于开发阶段,或者希望为 Curve25519 标量乘法启用 AVX512 SIMD 加速时才需要。 ``` $ cargo +nightly build --release --locked ``` 随后应该可以在 `target/release` 目录下找到 `klip` 可执行文件。 ## 设置 klip 需要一系列密钥。使用以下命令生成所有密钥 ``` $ klip genkeys ``` 这会生成随机密钥(强烈推荐)。 您需要将该命令输出的一部分(不是全部)复制到 `.klip.toml` 配置文件中。 一种临时的替代方法是通过密码派生密钥。在所有平台上,相同的密码将始终生成相同的密钥集。为此,请添加 `--password` 开关: ``` $ klip genkeys --password ``` `genkeys` 命令的输出就是您构建配置文件所需的全部内容。 在中转服务器上仅需复制服务器(servers)部分。在客户端上仅需复制客户端(clients)部分。 一台主机是否将同时充当中转服务器和客户端?在复制“hybrid”部分之前,请三思。以防万一,该部分已为您准备好。 配置文件的默认位置是 `~/.klip.toml`。可以使用 `--config` 选项并提供配置文件的路径来覆盖此设置。这非常有用,例如,如果您不想在 Windows 上使用点文件(dot files),因为它们不太常见。 ``` PS> echo "GNU Terry Pratchett" | klc --config C:\Users\isis\klip.toml ``` 中转服务器的示例配置文件: ``` listen = "0.0.0.0:8075" # edit appropriately psk = "0768e822c681c887e1c80ad57412aca814738bdd4380f00445d159d80d4c28c4" sign_pk = "6bdf6e6e0cfdcf6fd4991a9b27114a29fba538f91f84297892612a1b1767f58c" ``` 客户端的示例配置文件: ``` connect = "127.0.0.1:8075" # edit appropriately psk = "0768e822c681c887e1c80ad57412aca814738bdd4380f00445d159d80d4c28c4" sign_pk = "6bdf6e6e0cfdcf6fd4991a9b27114a29fba538f91f84297892612a1b1767f58c" sign_sk = "3128a243ebf8f78dbf551741775f9da36d1ac0ffa11dc7776d038310ea762f2f" encrypt_sk = "28956ee776dc1f171e652472c6a27ce27166bf58effa10b574dbe159128d8898" ``` 显然,请勿直接使用这些配置。按照[上文](#setup)所述获取您自己的密钥。编辑 `connect` 和 `listen` 属性,以匹配中转服务器的 IP 和端口。 执行 `chmod go-rwx ~/.klip.toml` 可能是个不错的主意。 ## 使用说明(中转服务器) 在中转服务器上运行以下命令(使用 `systemd`、`runit`、`openrc`,甚至 `docker` 或 `podman` 等将其作为后台服务运行): ``` $ klip serve ``` 中转服务器必须可公开访问。至少,客户端必须能够通过您在配置中指定的端口经由 TCP 访问它。 服务器将拒绝没有有效 API 密钥(包含在客户端配置文件中)的命令。 ## 使用说明(客户端) 将标准输入复制到剪贴板: ``` $ klip copy ``` 获取剪贴板的内容并将其输出到标准输出: ``` $ klip paste ``` 获取剪贴板的内容,清空剪贴板,并将其输出到标准输出。 ``` $ klip move ``` 好了,就这些! 向它输入任何内容。文本、二进制数据,任何格式。只要能放入内存中,它就能正常工作。 ## 建议的 shell 别名 等等,那开头提到的 `klc` 和 `klp` 命令呢? 那些只是 shell 别名。请查阅您的 shell 文档了解更多信息。下面提供了一些示例: ``` # klo : 将 复制到剪贴板 klo() { printf '%s' "$*" | klip copy } # klf : 将 的内容复制到剪贴板 klf() { klip copy < $1 } # klc: 从 STDIN 读取要复制的内容 alias klc='klip copy' # klp: 粘贴剪贴板内容 alias klp='klip paste' # klm: 移动剪贴板内容 alias klm='klip move' # klz: 删除剪贴板内容 alias klz='klip copy < /dev/null' # klfr []: 将整个目录作为 tar 归档发送到剪贴板 klfr() { tar cJpvf - ${1:-.} | klip copy } # klpr: 解压使用 klfr 命令发送的剪贴板内容 alias klpr='klip paste | tar xJpvf -' ``` ## klip 在第三方应用中的集成 - [VSCode 的 klip 扩展](https://github.com/lmaotrigine/vscode-klip) 是一个第一方扩展,允许在运行 Visual Studio Code 文本编辑器的主机之间复制和粘贴文本。 - [`klip.vim`](https://github.com/lmaotrigine/klip.vim) 是一个用于 Vim/ Neovim 的插件,允许复制和粘贴文本。 ## 使用场景 可用于 * 在主机之间安全地发送密码、API 密钥、URL * 与团队成员共享剪贴板(这会非常有意思) * 在没有 VMWare tools 或共享卷的情况下,从/向隔离的 VM 复制数据(非常适合不受支持的操作系统和恶意软件沙箱) * 无需 Samba 或 SSH 即可向/从 Windows 机器复制文件 * 在位于防火墙/NAT 网关后面的主机之间传输数据 * 轻松将配置文件复制到多台主机 * 在办公室开始一个缓慢的下载,稍后在家里获取 * 在处理文件之前快速将其备份到云端 * ……以及更多! ## 协议 通用定义 ``` k: API key ek: 256-bit symmetric encryption key ekid: encryption key ID encoded as an unsigned 64-bit little-endian integer m: plaintext ct: XChaCha20 ek,n (m) Hk,s: Blake2b(domain="KLIP", key=k, salt=s, size=32) Len(x): x encoded as an unsigned 64-bit little-endian integer n: random 192-bit nonce r: random 256-bit client nonce r': random 256-bit server nonce ts: Unix timestamp as an unsigned 64-bit little-endian integer Sid: Ed25519 v: 1 ``` 复制: ``` -> v || r || h0 h0 := Hk,0(v || r) <- v || r' || h1 h1 := Hk,1(v || r' || h0) -> 'S' || h2 || Len(ekid || n || ct) || ts || s || ekid || n || ct s := Sig(ekid || n || ct) h2 :=Hk,2(h1 || 'S' || ts || s) <- Hk.3(h2) ``` 移动/粘贴: ``` Move: opcode := 'M' Paste: opcode := 'G' -> v || r || h0 h0 := Hk,0(v || r) <- v || r' || h1 h1 := Hk,1(v || r' || h0) -> opcode || h2 h2 := Hk,2(h1 || opcode) <- Hk,3(h2 || ts || s) || Len(ekid || n || ct) || ts || s || ekid || n || ct s := Sig(ekid || n || ct) ``` ## 未来工作 - [ ] 由于频繁的主要版本升级,移除对 clap 的依赖
标签:Rust, 可视化界面, 文件传输, 端到端加密, 网络剪贴板, 网络流量审计, 通知系统