golang跨计算机快速文件传输命令行工具插件portal的使用

Golang跨计算机快速文件传输命令行工具插件Portal的使用

Portal简介

Portal是一个命令行文件传输工具,用于在任何计算机之间发送文件。

Portal工具展示

安装方法

macOS/Linux (使用Homebrew)

brew install portal

Windows (使用Scoop)

scoop install portal

Windows (使用WinGet)

winget install SpatiumPortae.portal

Arch Linux (AUR)

yay -S portal-bin

手动安装

curl -sL portal.spatiumportae.com | bash

wget -qO - portal.spatiumportae.com | bash

使用方法

发送文件和文件夹

portal send <文件1> <文件2> <文件夹1> <文件夹2> ...

命令会输出一个临时密码,格式如1-inertia-elliptical-celestial。发送方需要将这个密码通过安全渠道告知接收方。

接收文件和文件夹

portal receive 1-intertia-elliptical-celestial

双方将通过中继服务器建立连接。文件传输将根据实际情况使用直接连接或中继连接。

功能特点

  • 使用PAKE2进行端到端加密
  • 可能的情况下直接传输文件(如同一个本地网络)
  • 无法直接连接时回退到中继服务器
  • 文件的并行gzip压缩,更快更高效
  • 可以自建中继服务器
  • 可配置性和shell自动补全
  • 美观的用户界面

完整示例

发送文件示例

# 发送多个文件和文件夹
portal send document.pdf image.jpg ~/my_folder

输出:

Generated password: 42-relative-parsec-supernova
Please share this password with the receiver.

接收文件示例

# 接收文件
portal receive 42-relative-parsec-supernova

输出:

Receiving files from sender...
Progress: [====================================] 100%
Files saved to: /path/to/received_files

配置

Portal的配置文件位于$HOME/.config/portal/config.yml,是一个简单的YAML文件。

默认配置

# 中继服务器URL
relay: portal.spatiumportae.com
# 记录调试输出到文件
verbose: false
# 接收文件时提示覆盖重复文件
prompt_overwrite_files: true
# 使用"portal serve"时中继服务器使用的端口
relay_serve_port: 8080
# TUI样式
tui_style: rich

自建中继服务器

Portal二进制文件内置了中继服务器功能。启动自己的中继服务器非常简单:

portal serve --port 1337

建议将服务器日志输出通过jq处理:

portal serve --port 1337 2>&1 | jq .

示例输出:

{
  "level": "info",
  "ts": "2023-02-28T02:57:45.310134+01:00",
  "caller": "rendezvous/server.go:77",
  "msg": "serving rendezvous server",
  "version": "v1.2.1",
  "address": ":1337"
}

技术细节

中继服务器用于协商安全加密通道,但永远不会看到文件内容或临时密码。连接过程如下:

  1. 发送方连接到中继
  2. 中继为发送方分配数字ID并发送给发送方
  3. 发送方生成并输出密码(以ID开头)到终端,哈希密码并发送给中继
  4. 接收方哈希密码(通过安全渠道获得)并发送给中继
  5. 当双方都发送了哈希密码后,开始加密交换
  6. 加密交换完成后,所有消息都被加密,中继无法查看内容
  7. 文件传输开始,有两种方式:
    • 直接传输(如果双方在同一本地网络)
    • 通过中继传输(如果无法直接连接)

更多关于golang跨计算机快速文件传输命令行工具插件portal的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang跨计算机快速文件传输命令行工具插件portal的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang跨计算机快速文件传输工具Portal使用指南

Portal是一个用Go语言编写的跨计算机快速文件传输工具,它允许你在不同计算机之间快速传输文件和目录。下面我将详细介绍Portal的安装和使用方法,并提供Go代码示例。

安装Portal

首先,你需要安装Portal工具:

go install github.com/SpatiumPortae/portal@latest

或者从GitHub下载预编译的二进制文件:

# Linux
wget https://github.com/SpatiumPortae/portal/releases/download/v1.0.0/portal_1.0.0_linux_amd64.tar.gz
tar -xzf portal_1.0.0_linux_amd64.tar.gz
sudo mv portal /usr/local/bin/

# macOS
wget https://github.com/SpatiumPortae/portal/releases/download/v1.0.0/portal_1.0.0_darwin_amd64.tar.gz
tar -xzf portal_1.0.0_darwin_amd64.tar.gz
sudo mv portal /usr/local/bin/

基本使用方法

发送文件

在发送端计算机上运行:

portal send /path/to/file

这将生成一个一次性密码,接收方需要使用这个密码来接收文件。

接收文件

在接收端计算机上运行:

portal receive <password>

接收方需要与发送方在同一局域网内,或者发送方需要配置端口转发。

高级功能

发送整个目录

portal send -r /path/to/directory

指定自定义端口

portal send -p 8080 /path/to/file
portal receive -p 8080 <password>

压缩传输

portal send -z /path/to/large/file

Go代码示例

如果你想在自己的Go程序中集成类似功能,可以参考以下代码示例:

package main

import (
	"fmt"
	"net"
	"os"
	"path/filepath"
)

func sendFile(conn net.Conn, filePath string) error {
	// 打开文件
	file, err := os.Open(filePath)
	if err != nil {
		return err
	}
	defer file.Close()

	// 获取文件信息
	fileInfo, err := file.Stat()
	if err != nil {
		return err
	}

	// 发送文件名和大小
	fileName := filepath.Base(filePath)
	fileSize := fileInfo.Size()
	fmt.Fprintf(conn, "%s\n%d\n", fileName, fileSize)

	// 发送文件内容
	buf := make([]byte, 1024)
	for {
		n, err := file.Read(buf)
		if err != nil {
			break
		}
		conn.Write(buf[:n])
	}

	return nil
}

func receiveFile(conn net.Conn, savePath string) error {
	// 读取文件名和大小
	var fileName string
	var fileSize int64
	fmt.Fscanf(conn, "%s\n%d\n", &fileName, &fileSize)

	// 创建文件
	file, err := os.Create(filepath.Join(savePath, fileName))
	if err != nil {
		return err
	}
	defer file.Close()

	// 接收文件内容
	var received int64
	buf := make([]byte, 1024)
	for received < fileSize {
		n, err := conn.Read(buf)
		if err != nil {
			return err
		}
		file.Write(buf[:n])
		received += int64(n)
	}

	return nil
}

安全注意事项

  1. Portal传输默认不加密,敏感文件建议先加密再传输
  2. 一次性密码只能使用一次,传输完成后即失效
  3. 在公共网络使用时,建议配合VPN或SSH隧道

性能优化

对于大文件传输,可以考虑以下优化:

  1. 使用-z选项启用压缩
  2. 增加缓冲区大小
  3. 使用多线程传输(Portal暂不支持,但可以自行实现)

常见问题解决

  1. 连接失败:检查防火墙设置,确保端口(默认8080)开放
  2. 传输速度慢:检查网络状况,尝试使用有线连接
  3. 文件损坏:验证文件哈希值,或重新传输

Portal是一个简单高效的文件传输工具,特别适合在局域网内快速共享文件。对于更复杂的需求,可以考虑使用rsync或scp等工具。

希望这个指南对你有所帮助!如果你需要更复杂的功能,可以考虑基于上面的Go代码示例进行扩展开发。

回到顶部