1

我正在使用SFTP客户端从 SFTP 服务器获取文件。我能够成功读取文件并存储它,但是在完成保存后我无法从 SFTP 服务器中删除它。

代码

require 'net/sftp'

class Sftp
  def self.save
    Net::SFTP.start(somehost, ****, password: ****) do |sftp|
      sftp.dir.foreach("/files") do |entry|
        next unless entry.file?

        file_name = entry.name
        source_file = "/files/#{file_name}"
        destination_file = "tmp/#{file_name}"

        sftp.download!(source_file, destination_file)

        df = File.open(destination_file, "r")
        file_data = df.read

        # Some logic to utilise read file info. in variable "file_data"

        File.delete(df) # deleted from tmp
        sftp.remove!(source_file) # deleted from sftp server
      end
    end
  end
end

执行该行时sftp.remove!(source_file),我收到如下错误:

"Net::SFTP::StatusException (3, \"权限被拒绝\")"

文件目录权限

drwxr-xr-x  2 root    root    4096 Dec 22 10:54 files

文件目录中文件的权限:

drwxr-xr-x 2 root root   4096 Dec 22 10:54 .
drwxr-xr-x 4 root root   4096 Dec 18 15:29 ..
-rwxrwxrwx 1 root root 749199 Dec 18 14:39 a.pdf
-rwxrwxrwx 1 root root   7945 Dec 18 15:41 b.pdf
-rwxrwxrwx 1 root root   7945 Dec 22 10:54 c.pdf

编辑

我替换了以下代码行

sftp.remove!(source_file)

sftp.send(:exec, "sudo rm /var/sftp/#{source_file}")

现在,删除工作有效,但仅适用于第一个文件。然后循环退出,没有任何错误。

可能是什么原因?

4

1 回答 1

1

我假设您以 root 以外的用户身份登录到远程主机。这个对吗?

您的问题是 root 是远程主机上这些文件的所有者,并且作为 root 以外的用户,您无权删除它们。

如果您控制远程文件,您可能希望由 root 以外的用户保存它们——您可以登录以删除它们,但其他人不能,假设您不希望其他人能够删除文件。

如果您以 root 身份登录到该服务器,您应该能够删除这些文件。

关于这段代码:

df = File.open(destination_file, "r")
file_data = df.read
File.delete(df) # deleted from tmp

这是完成删除文件的一种过于复杂的方法。您正在读取文件的数据,file_data但没有对其进行任何操作。此外,无需打开文件即可将其删除——您可以调用File.delete文件规范而不是 File 对象。

于 2017-12-26T18:06:31.430 回答