#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. На это может ответить клиент. Есть ли способ для нас выяснить это самостоятельно?