Files
晴天 d976ee2c33 feat: relay 模式 + SSH 远程部署 + 官网移动端适配 + 国内镜像源
- 新增 relay 模式: frp 中继引擎,TCP/UDP 全协议穿透
- 新增 relay server setup: SSH 远程安装 frps 服务端
- 新增 sshutil 包: 纯 Go SSH 连接/远程执行
- 官网: 移动端响应式适配 (480/768/900px 三断点)
- 官网: 修复 Star 按钮样式,特性卡片 11→12
- install.sh: 国内镜像源加速 (ghfast/gh-proxy/ghproxy)
- Docker Compose + install-relay.sh 服务端部署方案
2026-02-26 22:29:56 +08:00

64 lines
1.1 KiB
Go

package cmd
import (
"bufio"
"fmt"
"os"
"time"
"github.com/qingchencloud/cftunnel/internal/relay"
"github.com/spf13/cobra"
)
var relayLogsFollow bool
func init() {
relayLogsCmd.Flags().BoolVarP(&relayLogsFollow, "follow", "f", false, "实时跟踪日志")
relayCmd.AddCommand(relayLogsCmd)
}
var relayLogsCmd = &cobra.Command{
Use: "logs",
Short: "查看中继客户端日志",
RunE: func(cmd *cobra.Command, args []string) error {
logFile := relay.LogFilePath()
f, err := os.Open(logFile)
if err != nil {
return fmt.Errorf("日志文件不存在: %s", logFile)
}
defer f.Close()
lines, err := tailLines(f, 100)
if err != nil {
return err
}
for _, line := range lines {
fmt.Println(line)
}
if !relayLogsFollow {
return nil
}
stat, _ := f.Stat()
offset := stat.Size()
for {
f2, err := os.Open(logFile)
if err != nil {
continue
}
stat2, _ := f2.Stat()
if stat2.Size() > offset {
f2.Seek(offset, 0)
scanner := bufio.NewScanner(f2)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
offset = stat2.Size()
}
f2.Close()
time.Sleep(500 * time.Millisecond)
}
},
}