2016-12-09 5 views
2

Я пытаюсь загрузить фид продукта в аккаунт Google Merchant SFTP. Я могу загрузить файл вручную через командную строку, но при попытке сделать это через Go встретите следующую ошибку.SFTP In 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

Вы не установили текущий рабочий каталог при создании файла. 'Sftp.Create ("/ ваш/рабочий/путь/products.xml")'. Возможно, в момент подключения ваш пользователь не имеет каких-либо привилегий со стандартным каталогом. – Motakjuq

+0

Я попытался сделать простой put из командной строки, и он загрузил файл с флагами как '--w - w - w-'. Когда я смотрю на документы для 'sftp.Create', создается файл с' 0666', что и вызывает его. Мне нужно создать файл с правами только на запись. – Danish

ответ

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() то есть создать файл, он не существует и обрезает файл, если он делает.

 Смежные вопросы

  • Нет связанных вопросов^_^