使用Ruby和SCP / SSH,如何在上载副本之前确定文件是否存在

时间:2009-10-26 16:14:19

标签: ruby file-upload scp net-ssh

我正在使用SCP将文件上传到远程服务器,但在这样做之前,查看该文件是否存在的正确方法是什么?

3 个答案:

答案 0 :(得分:9)

你无法用scp做到这一点。但是你可以用sftp.来做 它看起来像这样:

require 'net/sftp'

remote_path = "/path/to/remote/file"
Net::SFTP.start('host', 'username', :password => 'password') do |sftp|
  sftp.stat!(remote_path) do |response|
    unless response.ok?
    sftp.upload!("/path/to/local/file", remote_path)
  end
end

答案 1 :(得分:2)

当心检查然后上传:这不是原子的,可能会导致竞争条件(或TOCTOU漏洞)。

更好的方法可能是在上传的文件上设置文件权限,使其不可写(在类UNIX系统上为400或444或类似),然后任何后续上传到同一文件名都将失败。 (你会得到“许可被拒绝”,这可能会受到一些解释(例如,上传目录权限是否会改变?)。这是此方法的一个缺点。)

如何设置远程文件的权限?最简单的方法是将它们设置在本地文件上,然后在上载时保留它们。 Ruby的Net :: SCP README表示它确实可以“保留跨传输的文件属性”。

答案 2 :(得分:-1)

这绝对能解决您的问题并提供额外信息。 http://ruby.about.com/od/ssh/ss/netscp.htm