golang sftp Этот сервис разрешает только соединения sftp - PullRequest
0 голосов
/ 17 мая 2018
func (c *Client) Upload(local, remote string) error {
    client, err := sftp.NewClient(c.SSHClient)
    if err != nil {
        return err
    }
    defer client.Close()
    localFile, err := os.Open(local)
    if err != nil {
        return err
    }
    defer localFile.Close()
    remoteFile, err := client.Create(remote)
    if err != nil {
        return err
    }
    _, err = io.Copy(remoteFile, localFile)
    return err
}

Я вызываю эту функцию для загрузки файла в SFTP без какой-либо ошибки возврата.

Используйте командную строку для загрузки следующим образом: Результат выполнения команды

Я использую эту функцию

var localFilePath = "./1234.zip"
var remoteDir = "upload/uuuuu.zip"
err = client.Upload(localFilePath, remoteDir)
if err != nil {
    panic(err)
}
fmt.Println("ok")

Результат выполнения не возвращает ошибок, только возвращает: загрузка файла завершена

Но при посадке SFTP файла загрузки нет, попросите всех указать! Введен: Этот сервис разрешает только sftp-соединения go версия go1.10.2 linux / amd64

Упростите код, весь процесс выглядит так

func Consftp(username, host, privKeyPath, local, remote string) error {
    privKey, err := ioutil.ReadFile(privKeyPath)
    if err != nil {
        return err
    }
    signer, err := ssh.ParsePrivateKey(privKey)
    if err != nil {
        return err
    }

    authMethod := ssh.PublicKeys(signer)
    config := &ssh.ClientConfig{
        User:            username,
        Auth:            []ssh.AuthMethod{authMethod},
        HostKeyCallback: HostKeyCallback,
    }

    conn, err := ssh.Dial("tcp", host, config)
    if err != nil {
        return err
    }
    client, err := sftp.NewClient(conn)
    if err != nil {
        return err
    }
    defer client.Close()
    localFile, err := os.Open(local)
    if err != nil {
        return err
    }
    defer localFile.Close()
    remoteFile, err := client.Create(remote)
    println(err)
    if err != nil {
        return err
    }
    _, err = io.Copy(remoteFile, localFile)
    return err
}

код заполнен

package until

import (
    "io"
    "io/ioutil"
    "os"

    "github.com/pkg/sftp"
    "golang.org/x/crypto/ssh"
)
func Consftp(username, host, privKeyPath, local, remote string) error {
    privKey, err := ioutil.ReadFile(privKeyPath)
    if err != nil {
        return err
    }
    signer, err := ssh.ParsePrivateKey(privKey)
    if err != nil {
        return err
    }

    authMethod := ssh.PublicKeys(signer)
    config := &ssh.ClientConfig{
        User:            username,
        Auth:            []ssh.AuthMethod{authMethod},
        HostKeyCallback: HostKeyCallback,
    }

    conn, err := ssh.Dial("tcp", host, config)
    if err != nil {
        return err
    }
    defer conn.Close()
    client, err := sftp.NewClient(conn)
    if err != nil {
        return err
    }
    defer client.Close()
    localFile, err := os.Open(local)
    if err != nil {
        return err
    }
    defer localFile.Close()
    remoteFile, err := client.Create(remote)
    println(err)
    if err != nil {
        return err
    }
    _, err = io.Copy(remoteFile, localFile)
    return err
}
...