Scaf 通过配对和中继反向连接建立点到点的流传输,用于远程命令执行、文件传输等。
在 Scaf 中一个会话由服务端、客户端 A 和客户端 B 三方参与。客户端 A 首先连接到服务端创建“流”,随后客户端 B 连接到服务端接入相同的“流”,两个连接建立后服务端将从客户端 A 读取的数据转发到 B 并将从 B 读取的数据转发到 A 。从而实现客户端 A 和 B 之间的点到点的流传输。
Scaf 目前提供用于远程命令执行和文件传输的客户端实现,但 Scaf 的功能不止于此,使用 Scaf API 可直接与 Scaf 服务端交互,在通过 Scaf 服务端建立的流中可以传输任何数据,基于此可以实现更多其它基于点对点的流传输的应用。
直接使用镜像 ghcr.io/yhlooo/scaf
docker run 即可:
docker run -it --rm ghcr.io/yhlooo/scaf:latest --help
通过 Releases 页面下载可执行二进制,解压并将其中 scaf
文件放置到任意 $PATH
目录下。
要求 Go 1.22 ,执行以下命令下载源码并构建:
go install github.com/yhlooo/scaf/cmd/scaf@latest
构建的二进制默认将在 ${GOPATH}/bin
目录下,需要确保该目录包含在 $PATH
中。
scaf serve
默认参数下 Scaf 监听地址为 :9443
,通过 -l
参数可指定其他地址。
在监听地址上 Scaf 服务端同时支持 gRPC 和 HTTP 协议。在 Scaf 客户端通过 -s
参数指定服务端地址,使用 grpc://<host>:<port>
指定以 gRPC 协议访问,使用 http://<host>:<port>
指定使用 HTTP 协议访问。
监视端创建流,开启命令执行会话:
scaf exec-remote -it -s <SERVER_URL> -- <COMMAND> [ARGS...]
监视端开启后会输出流名 <STREAM_NAME>
和其连接凭证 <TOKEN>
,在执行端使用该信息连接并开始命令执行:
scaf exec -s <SERVER_URL> --stream <STREAM_NAME> --token <TOKEN>
执行端开始执行后,命令执行的输入输出会转发到监视端。
执行端创建流,开启命令执行会话:
scaf exec -it -s <SERVER_URL> -- <COMMAND> [ARGS...]
执行端开始执行后会输出流名 <STREAM_NAME> 和其连接凭证 ,在监视端使用该信息连接并获取输入输出:
scaf attach -s <SERVER_URL> --stream <STREAM_NAME> --token <TOKEN>
在发送端创建流,开启文件发送会话:
scaf send-file -s <SERVER_URL> <PATH>
<PATH>
是发送的文件或目录路径。
发送端开启后会输出流名 <STREAM_NAME>
和其连接凭证 <TOKEN>
,在接收端使用该信息连接并获取文件:
scaf receive-file -s <SERVER_URL> --stream <STREAM_NAME> --token <TOKEN> [PATH]
[PATH]
是可选的接收文件的路径,未指定时使用当前工作目录。
接收端连接后,文件会开始传输。