【问题标题】:sftp O_RDONLY works fine but O_RDWR does notsftp O_RDONLY 工作正常,但 O_RDWR 不能
【发布时间】:2019-11-14 06:42:58
【问题描述】:

我可以在使用函数 Open() 或 OpenFile(path, os.O_RDONLY) 后读取文件,但之后无法删除文件。所以我尝试使用写标志 os.RDWR 打开文件,如下面的代码,看看我是否可以删除文件。但是,使用 os.RDWR 我什至无法读取该文件。谁能向我解释一下导致这个问题的原因?我收到错误 sftp:“权限被拒绝”(SSH_FX_PERMISSION_DENIED) 我试过查看文件的权限码,文件是-rwxrwxrwx。

import (github.com/pkg/sftp)

config = sftp.NewConfig(nil)
config.SetAcct("xxxxx","xxxxx")
config.SetDes("ip address", 1234)
config.Connect()

if file, err = config.Client.OpenFile(path, os.O_RDWR); err != nil {
        log.Println("Cannot open "+path+" , err:", err)
 }

if _, err = ioutil.ReadAll(file); err != nil {
        log.Println("Cannot read "+path+", err:", err)
}

file.Close()

err = config.Client.Remove(file)
if err != nil {
         log.Println("cannot remove file)
}

问题已解决: 发现我打开了文件而没有关闭它。并且不知何故,该文件仍然由 FreeSSHDService 打开。这就是为什么我无法删除该文件。

【问题讨论】:

  • 文件所在目录的权限是什么?您必须在目录中具有写权限。
  • @BurakSerdar drwxrwxrwx 来自 func Mode()
  • 什么是config.Client?也许你可以发布它的相关部分。另外,该文件是普通文件吗?
  • @BurakSerder 我将其发布在代码部分。配置来自 sftp 包。该文件是一个二进制文件。它是什么文件有关系吗?如果我使用 Open(),我可以阅读它,但当我使用 OpenFile() 和 O_RDWR 时,我不能。
  • 您正在使用 sftp。在文件系统向您显示的内容之上还有另一层权限。听起来 sftp 服务器为您提供只读访问权限。

标签: go sftp


【解决方案1】:

您必须提供文件路径,而不是提供文件处理程序。

config.Client.Remove(pathTofile)
defer file.close()

这里是参考https://godoc.org/github.com/pkg/sftp#Client.Remove

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2013-06-29
    • 2021-06-28
    • 2022-09-27
    相关资源
    最近更新 更多