Не удалось отправить пакет: ошибка EOF из sftp

#go #ssh #sftp

#Вперед #ssh #sftp

Вопрос:

Я работаю над модулем SFTP в Go. Мой код способен опрашивать и считывать некоторые файлы, но сталкивается с этой ошибкой после определенного этапа. После прочтения файла я выполняю HTTP-вызов другого приложения для передачи файла. Время ожидания HTTP-вызова составляет 120 секунд, но я не установил никакого времени ожидания для ssh / sftp-клиента. Публикую код, который я использую. Помогите мне выяснить, почему возникает эта ошибка.. http-вызов завершается с ошибкой несколько раз, что приводит к ожиданию всех 120 каждый раз. Я что-то пропустил?

 package main

import (
    "encoding/json"
    "fmt"
    "io"
    "io/ioutil"
    "os"
    "os/exec"
    "time"

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

func getFiles() {
    sshconfig.SetDefaults()
    cipherOrder := sshconfig.Ciphers
    sshconfig.Ciphers = append(cipherOrder, "aes256-cbc", "3des-cbc")

    config := amp;ssh.ClientConfig{
        User:            user,
        HostKeyCallback: ssh.InsecureIgnoreHostKey(),
        Auth: []ssh.AuthMethod{
            ssh.Password(pwd),
        },
        Config: sshconfig,
    }

    // connect to the server
    client, err := ssh.Dial("tcp", host, config)
    if err != nil {
        log.Println("Failed to dial")
        panic(err)
    }

    log.Println("SUCCESSFULLY CONNECTED TO SFTP SERVER")

    // open an SFTP session over an existing ssh connection.
    sftp, err := sftp.NewClient(client)
    if err != nil {
        log.Println("Failed to establish an SSH session!")
        panic(err)
    }
    log.Println("Established an SSH session!")

    defer sftp.Close()

    //read files from the root directory
    files, err = sftp.ReadDir(folder)
    if err != nil {
        log.Println("Unable to read sftp directory")
        panic(err)
    }

    log.Println("OPENED DIRECTORY")

    for file := range files {
        fileName := files[file].Name()
        log.Println("Found file inside dir: ", fileName)

        // Open the source file
        srcFile, err := sftp.Open(folder   fileName)
        if err != nil {
            log.Println("Unable to open file")  //it is failing here
            panic(err)                          // failed to send packet: EOF
        }
        
        log.Println("Opened file")

        //create file in input directory
        dstFile, err := os.Create(inputDest   fileName)
        if err != nil {
            log.Println("Unable to create destination file")
            panic(err)
        }

        log.Println("Created destination file")
        // defer dstFile.Close()

        // Copy the file
        srcFile.WriteTo(dstFile)
        
        log.Println("Copied contents from source to destination file.")
        
        dstFile.Close()
        srcFile.Close()

        //read file to bytes
        bodyBytes, err := ioutil.ReadFile(inputDest   fileName)
        if err != nil {
            log.Println("Unable to read file to parse!")
            panic(err)
        }

        log.Println("Read file to pass on to second application!")

        //Http call with timeout 120s
    }
}
  

Комментарии:

1. Ваш клиент поддерживает NAT? Или целевой сервер, стоящий за (D) NAT?

2. На это может ответить клиент. Есть ли способ для нас выяснить это самостоятельно?