我正在使用SFTP客户端从SFTP服务器获取文件。我能够成功读取并存储它,但是在保存完成后我无法从SFTP服务器中删除它。
CODE
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,\”permission denied \“)”
文件目录
的权限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}")
现在,删除工作正常,但仅适用于第一个文件。然后循环退出而没有任何错误。
可能是什么原因?
答案 0 :(得分:1)
我假设您以非root用户身份登录远程主机。这是对的吗?
您的问题是root是远程主机上这些文件的所有者,并且作为root以外的用户,您无权删除它们。
如果您控制远程文件,您可能希望由root以外的用户保存它们 - 您可以登录以删除它们但是其他人无法登录的用户,假设您不是希望其他人能够删除文件。
如果您以root用户身份登录该服务器,则应该能够删除这些文件。
关于此代码:
df = File.open(destination_file, "r")
file_data = df.read
File.delete(df) # deleted from tmp
这是完成删除文件的过于复杂的方法。您正在将文件的数据读入file_data
但未对其执行任何操作。此外,无需打开文件来删除它 - 您可以在filespec而不是File对象上调用File.delete
。