docker
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user