Skip to content

Commit aa5d33a

Browse files
committed
v1.9.2
1 parent d15f6e5 commit aa5d33a

17 files changed

Lines changed: 1206 additions & 30 deletions

File tree

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88

99
## 更新说明
1010

11-
### v1.9.1
11+
### v1.9.2
1212

1313
感谢师傅们提供的修改建议,目前已更新一下功能:
1414

15-
1. 修复note笔记显示逻辑;;
15+
1. 新增redis命令执行功能;
1616

1717
## 工具介绍
1818

@@ -113,6 +113,7 @@ cd /D EasyToolsFiles\tools\gui_webshell\Godzilla && loader.vbs [可选参数]
113113
#### Redis
114114

115115
![image-20250706200748776](images/image-20250706200748776.png)
116+
![image-20251020123650](images/image-20251020123650.png)
116117

117118
### 编码解码
118119

@@ -150,7 +151,7 @@ cd /D EasyToolsFiles\tools\gui_webshell\Godzilla && loader.vbs [可选参数]
150151

151152
### 便携发包
152153

153-
类似于postman,支持环境变量、get、post、del、put等各种常用功能
154+
类似于postman,支持环境变量、get、post、del、put等各种常用功能
154155

155156
![image-20250917151543513.png](images/image-20250917151543513.png)
156157

app/connect/redis/internal/define/define.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ type SSHConfig struct {
2020
SSHPassword string `json:"ssh_password"`
2121
}
2222

23+
// CommandResult 命令执行结果
24+
type CommandResult struct {
25+
Success bool `json:"success"` // 是否成功
26+
Data interface{} `json:"data"` // 执行结果数据
27+
Error string `json:"error"` // 错误信息
28+
Duration int64 `json:"duration"` // 执行耗时(毫秒)
29+
}
30+
31+
// CommandHistory 命令历史记录
32+
type CommandHistory struct {
33+
Command string `json:"command"` // 命令
34+
Success bool `json:"success"` // 是否成功
35+
Timestamp int64 `json:"timestamp"` // 执行时间戳
36+
}
37+
2338
var (
2439
// DefaultKeyLen 键列表的默认查询长度
2540
DefaultKeyLen int64 = 100

app/connect/redis/internal/service/connection.go

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,90 @@ package service
33
import (
44
"EasyTools/app/connect/redis/internal/define"
55
"EasyTools/app/connect/redis/internal/helper"
6+
"context"
67
"encoding/json"
78
"errors"
8-
uuid "github.com/satori/go.uuid"
9+
"fmt"
10+
"net"
911
"os"
1012
"path/filepath"
13+
"time"
14+
15+
"github.com/go-redis/redis/v8"
16+
uuid "github.com/satori/go.uuid"
17+
"golang.org/x/crypto/ssh"
1118
)
1219

20+
// ConnectionTest 测试连接
21+
func ConnectionTest(conn *define.Connection) error {
22+
if conn.Addr == "" {
23+
return errors.New("连接地址不能为空")
24+
}
25+
if conn.Port == "" {
26+
conn.Port = "6379"
27+
}
28+
29+
// 创建 Redis 客户端配置
30+
redisOpts := &redis.Options{
31+
Addr: fmt.Sprintf("%s:%s", conn.Addr, conn.Port),
32+
Password: conn.Password,
33+
DB: 0, // 默认数据库
34+
}
35+
36+
var rdb *redis.Client
37+
var sshClient *ssh.Client
38+
39+
// 如果是 SSH 连接,先建立 SSH 隧道
40+
if conn.Type == "ssh" && conn.SSHAddr != "" {
41+
sshConfig := &ssh.ClientConfig{
42+
User: conn.SSHUsername,
43+
Auth: []ssh.AuthMethod{
44+
ssh.Password(conn.SSHPassword),
45+
},
46+
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
47+
Timeout: 10 * time.Second,
48+
}
49+
50+
// 建立 SSH 连接
51+
var err error
52+
sshClient, err = ssh.Dial("tcp", fmt.Sprintf("%s:%s", conn.SSHAddr, conn.SSHPort), sshConfig)
53+
if err != nil {
54+
return fmt.Errorf("SSH连接失败: %v", err)
55+
}
56+
defer sshClient.Close()
57+
58+
// 通过 SSH 隧道建立 Redis 连接
59+
sshConn, err := sshClient.Dial("tcp", fmt.Sprintf("%s:%s", conn.Addr, conn.Port))
60+
if err != nil {
61+
return fmt.Errorf("通过SSH连接Redis失败: %v", err)
62+
}
63+
defer sshConn.Close()
64+
65+
// 使用自定义拨号器
66+
redisOpts.Dialer = func(ctx context.Context, network, addr string) (net.Conn, error) {
67+
return sshClient.Dial(network, addr)
68+
}
69+
// 重置地址为本地,因为实际连接是通过 SSH 隧道
70+
redisOpts.Addr = "127.0.0.1:6379"
71+
}
72+
73+
// 创建 Redis 客户端
74+
rdb = redis.NewClient(redisOpts)
75+
defer rdb.Close()
76+
77+
// 测试连接
78+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
79+
defer cancel()
80+
81+
// 执行 PING 命令测试连接
82+
_, err := rdb.Ping(ctx).Result()
83+
if err != nil {
84+
return fmt.Errorf("Redis连接测试失败: %v", err)
85+
}
86+
87+
return nil
88+
}
89+
1390
// ConnectionList 连接列表
1491
func ConnectionList() ([]*define.Connection, error) {
1592
baseDir := helper.GetAppBaseDir()

0 commit comments

Comments
 (0)