Используя Ruby и SCP / SSH, как определить, существует ли файл перед загрузкой копии

StackOverflow https://stackoverflow.com/questions/1625693

  •  06-07-2019
  •  | 
  •  

Вопрос

Я загружаю файл на удаленный сервер, используя SCP, но как правильно проверить, существует ли этот файл, прежде чем сделать это?

Это было полезно?

Решение

Остерегайтесь проверки-затем-загрузки: это не атомарное и может привести к условиям гонки (или уязвимости TOCTOU).

Лучшим способом пересылки может быть установка прав доступа к файлу для загружаемого файла, чтобы он не был доступен для записи (400 или 444 или аналогичный в UNIX-подобных системах), тогда любая последующая загрузка в то же имя файла просто не удалась. (Вы получите ответ «Отказано в доступе», который может быть немного интерпретирован (например, изменились ли разрешения для каталога загрузки?). Это один недостаток этого метода).

Как вы устанавливаете разрешения для удаленного файла? Самый простой способ сделать это - установить их в локальный файл, а затем сохранить их при загрузке. Ruby's Net :: SCP README говорит, что может действительно, «сохранять атрибуты файлов при переносе».

Другие советы

Вы не можете сделать это с помощью 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