使用Golang通过SSH读取远程ZIP文件

使用Golang通过SSH读取远程ZIP文件 我需要通过使用 sftp 包 - github.com/pkg/sftp - pkg.go.dev 建立的 SSH 连接来打开一个远程的 zip 文件。

但是 zip 包库和 SSH 无法匹配 File 类型。

有没有办法扫描远程的压缩文件?

提前感谢。

此致敬礼

2 回复

你不能使用 zip.NewReader 配合 sftp.File 吗?看起来 sftp.File 实现了 io.ReaderAt

更多关于使用Golang通过SSH读取远程ZIP文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


可以通过 sftp 包读取远程文件,然后使用 zip.NewReader 来处理内存中的 ZIP 数据。以下是一个示例代码:

package main

import (
    "archive/zip"
    "fmt"
    "io"
    "log"

    "github.com/pkg/sftp"
    "golang.org/x/crypto/ssh"
)

func main() {
    // 建立 SSH 连接
    sshConfig := &ssh.ClientConfig{
        User: "username",
        Auth: []ssh.AuthMethod{
            ssh.Password("password"),
        },
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
    }

    sshClient, err := ssh.Dial("tcp", "remotehost:22", sshConfig)
    if err != nil {
        log.Fatal(err)
    }
    defer sshClient.Close()

    // 创建 SFTP 客户端
    sftpClient, err := sftp.NewClient(sshClient)
    if err != nil {
        log.Fatal(err)
    }
    defer sftpClient.Close()

    // 打开远程 ZIP 文件
    remoteFile, err := sftpClient.Open("/path/to/remote/file.zip")
    if err != nil {
        log.Fatal(err)
    }
    defer remoteFile.Close()

    // 获取文件大小
    fileInfo, err := remoteFile.Stat()
    if err != nil {
        log.Fatal(err)
    }

    // 将整个文件读入内存
    data := make([]byte, fileInfo.Size())
    _, err = io.ReadFull(remoteFile, data)
    if err != nil {
        log.Fatal(err)
    }

    // 创建 ZIP reader
    zipReader, err := zip.NewReader(bytes.NewReader(data), fileInfo.Size())
    if err != nil {
        log.Fatal(err)
    }

    // 遍历 ZIP 文件内容
    for _, file := range zipReader.File {
        fmt.Printf("File: %s\n", file.Name)
        
        rc, err := file.Open()
        if err != nil {
            log.Fatal(err)
        }
        
        // 读取文件内容
        content, err := io.ReadAll(rc)
        if err != nil {
            log.Fatal(err)
        }
        rc.Close()
        
        fmt.Printf("Size: %d bytes\n", len(content))
    }
}

需要导入 bytes 包:

import "bytes"

这个方法先将整个远程 ZIP 文件读取到内存中,然后使用 zip.NewReader 创建 ZIP reader。这样可以避免类型不匹配的问题,因为 zip.NewReader 接受 io.ReaderAt 接口,而 bytes.Reader 实现了这个接口。

注意:对于大文件,这种方法会占用较多内存。如果 ZIP 文件很大,可能需要考虑流式处理或其他优化方案。

回到顶部