2016-12-09 4 views
2

Google Merchant SFTPアカウントに商品フィードをアップロードしようとしています。コマンドプロンプトでファイルを手動でアップロードすることはできますが、Goから実行しようとすると次のエラーが発生します。SFTP In Goエラー:ユーザーに適切な読み取り権限がありません

エラーsftp: "User does not have appropriate read permission." (SSH_FX_PERMISSION_DENIED)

私はhttps://godoc.org/github.com/pkg/sftp#Client.Openの例以下、github.com/pkg/sftpパッケージを使用しています。私は、ここでCreate/Writeパターンが単純なputコマンドラインから異なってしまうと思われます。私はこの問題を持っている他の誰を助けるために自分の質問に答えるのです

remoteFile, err := sftp.Create(remoteFileName) 
+1

ファイルの作成時に現在の作業ディレクトリを設定していません。 'sftp.Create("/your/working/path/products.xml ")'を実行します。おそらく、接続の瞬間に、あなたのユーザーはデフォルトのディレクトリパスにいくつかの権限を持っていないかもしれません。 – Motakjuq

+0

コマンドラインから単純なputを実行しようとしましたが、フラグ付きのファイルを '--w - w - w-'としてアップロードしました。 'sftp.Create'のドキュメントを見ると' 0666'というファイルが作成されます。これが原因です。私は、書き込み専用のアクセス権を持つファイルを作成できる必要があります。 – Danish

答えて

2

コード

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()すなわちの動作を模倣し、それがない場合は、ファイルが切り捨てられます。

関連する問題