我正在使用SCP将文件上传到远程服务器,但在这样做之前,查看该文件是否存在的正确方法是什么?
答案 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