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

有帮助吗?

解决方案

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

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

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

其他提示

你无法用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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top