我正在尝试将商品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)
答案 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()
的行为,即创建一个不存在的文件,如果存在,则截断文件。