SFTP In Go错误:用户没有适当的读取权限

时间:2016-12-09 21:40:16

标签: go sftp

我正在尝试将商品Feed上传到Google Merchant SFTP帐户。我可以通过命令提示符手动上传文件,但在尝试通过Go执行此操作时会遇到以下错误。

错误sftp: "User does not have appropriate read permission." (SSH_FX_PERMISSION_DENIED)

我正在使用github.com/pkg/sftp包,遵循https://godoc.org/github.com/pkg/sftp#Client.Open中的示例。我怀疑此处的Create / Write模式最终与命令行中的简单put不同。

代码

func (g *GoogleExporter) ExportToSFTP(file []byte) error {

// Creating an SSH connection
sshConfig := &ssh.ClientConfig{
    User: g.Creds.AccessData.SFTPUser,
    Auth: []ssh.AuthMethod{
        ssh.Password(g.Creds.AccessData.SFTPPassword),
    },
}

hostPort := fmt.Sprintf("%s:%d", SFTPHostName, SFTPHostPort)
connection, err := ssh.Dial("tcp", hostPort, sshConfig)
if err != nil {
    return err
}

fmt.Println(">> SSH Connection Created!")

// Creating an SFPT connection over SSH
sftp, err := sftp.NewClient(connection)
if err != nil {
    return err
}
defer sftp.Close()

fmt.Println(">> SFTP Client Created!")

// Uploading the file
remoteFileName := "products.xml" // TODO: Make this name configurable
remoteFile, err := sftp.Create(remoteFileName)
if err != nil {
    return err
}
fmt.Println(">> SFTP File Created!")
if _, err := remoteFile.Write(file); err != nil {
    return err
}

fmt.Println("Successfully uploaded product feed to SFTP, file:%s user:%s", remoteFileName, g.Creds.AccessData.SFTPUser)
util.Log("Successfully uploaded product feed to SFTP, file:%s user:%s", remoteFileName, g.Creds.AccessData.SFTPUser)

// Confirming if the file is there
if _, err := sftp.Lstat(remoteFileName); err != nil {
    return err
}

return nil
}

错误是由此行引起的:

remoteFile, err := sftp.Create(remoteFileName)

1 个答案:

答案 0 :(得分:2)

我正在回答我自己的问题,以帮助遇到此问题的其他人。我找到了解决方案。

Google Merchant SFTP 帐户仅为您提供只写访问权限。但是,根据文档,在使用sftp.Create(..)函数时,它会创建一个标记为0666的文件,这与您用户设置的权限不一致。

要使用只写权限模仿sftp.Create(..)的行为,您可以使用更通用的sftp.OpenFile(..)函数。

remoteFile, err := sftp.OpenFile(fileName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC)

标志os.O_WRONLY|os.O_CREATE|os.O_TRUNC将模仿Create()的行为,即创建一个不存在的文件,如果存在,则截断文件。