我正在尝试将产品 Feed 上传到 Google Merchant SFTP 帐户。我可以通过命令提示符手动上传文件,但在尝试通过 Go 执行此操作时遇到以下错误。
错误:sftp: "User does not have appropriate read permission." (SSH_FX_PERMISSION_DENIED)
我正在使用该包,遵循https://godoc.org/github.com/pkg/sftp#Client.Opengithub.com/pkg/sftp中的示例。我怀疑这里的/模式最终与简单的命令行不同。CreateWriteput
代码
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
}
Run Code Online (Sandbox Code Playgroud)
该错误是由这一行引起的:
remoteFile, err := sftp.Create(remoteFileName)
Run Code Online (Sandbox Code Playgroud)
我正在回答我自己的问题,以帮助其他遇到此问题的人。我找到了解决方案。
Google Merchant SFTP帐户仅授予您写入访问权限。但是,根据文档,在使用该sftp.Create(..)函数时,它会创建一个标志为 的文件0666,该文件与您的用户设置的权限不一致。
sftp.Create(..)要模仿只写权限的行为,您可以使用更通用的sftp.OpenFile(..)函数。
remoteFile, err := sftp.OpenFile(fileName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC)
Run Code Online (Sandbox Code Playgroud)
这些标志os.O_WRONLY|os.O_CREATE|os.O_TRUNC将模仿以下行为:Create()即创建一个不存在的文件,如果存在则截断该文件。