lmaotrigine/klip
GitHub: lmaotrigine/klip
klip 是一款跨网络的命令行剪贴板工具,允许用户在不同主机间通过中转服务器安全地复制粘贴文本和文件。
Stars: 0 | Forks: 0
# klip
通过网络复制/粘贴任何内容。

曾经需要一个能在网络上共享的剪贴板吗?
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, 可视化界面, 文件传输, 端到端加密, 网络剪贴板, 网络流量审计, 通知系统