This commit is contained in:
12600k-rog-d4
2026-08-24 00:35:30 +08:00
parent 32b308bc08
commit b673ed62f9
24 changed files with 483 additions and 393 deletions

View File

@@ -2,11 +2,14 @@ package sshclient
import (
"fmt"
"io"
"net"
"os"
"path"
"strings"
"time"
"github.com/pkg/sftp"
"golang.org/x/crypto/ssh"
)
@@ -113,6 +116,45 @@ func EnsureHome(client *ssh.Client) {
RunCommand(client, fmt.Sprintf("mkdir -p %s", home))
}
// UploadFile 通过 SFTP 把本地文件上传到远端指定路径(复用已有 SSH 连接)
func UploadFile(client *ssh.Client, localPath, remotePath string) error {
src, err := os.Open(localPath)
if err != nil {
return fmt.Errorf("打开本地文件失败: %w", err)
}
defer src.Close()
info, err := src.Stat()
if err != nil {
return fmt.Errorf("读取文件信息失败: %w", err)
}
sftpCli, err := sftp.NewClient(client)
if err != nil {
return fmt.Errorf("创建 SFTP 会话失败: %w", err)
}
defer sftpCli.Close()
// 确保远端目录存在(/tmp 一般已存在,兜底处理)
if dir := path.Dir(remotePath); dir != "" && dir != "/" {
_ = sftpCli.MkdirAll(dir)
}
dst, err := sftpCli.Create(remotePath)
if err != nil {
return fmt.Errorf("创建远端文件失败: %w", err)
}
defer dst.Close()
fmt.Printf(" [上传] %s -> %s (%.1f MB)...\n", localPath, remotePath, float64(info.Size())/1024/1024)
start := time.Now()
if _, err := io.Copy(dst, src); err != nil {
return fmt.Errorf("文件传输失败: %w", err)
}
fmt.Printf(" [上传] 完成,耗时 %.1fs\n", time.Since(start).Seconds())
return nil
}
// buildSSHConfig 构建认证配置
func (c *Config) buildSSHConfig() (*ssh.ClientConfig, error) {
var authMethods []ssh.AuthMethod