:
コード
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
}
エラーは、この行によって原因です。私は解決策を見つけることができました。
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()
すなわちの動作を模倣し、それがない場合は、ファイルが切り捨てられます。
ファイルの作成時に現在の作業ディレクトリを設定していません。 'sftp.Create("/your/working/path/products.xml ")'を実行します。おそらく、接続の瞬間に、あなたのユーザーはデフォルトのディレクトリパスにいくつかの権限を持っていないかもしれません。 – Motakjuq
コマンドラインから単純なputを実行しようとしましたが、フラグ付きのファイルを '--w - w - w-'としてアップロードしました。 'sftp.Create'のドキュメントを見ると' 0666'というファイルが作成されます。これが原因です。私は、書き込み専用のアクセス権を持つファイルを作成できる必要があります。 – Danish