2009-10-26 19 views

Répondre

2

Prenez garde l'enregistrement puis-upload: ce n'est pas atomique et peut conduire à des conditions de course (ou vulnérabilités TOCTOU). Une meilleure façon d'avancer pourrait être de définir les autorisations de fichiers sur le fichier téléchargé pour qu'il ne soit pas inscriptible (400 ou 444 ou similaire sur les systèmes de type UNIX), puis tout téléchargement ultérieur vers le même nom de fichier échouera tout simplement. (Vous obtiendrez une "autorisation refusée" qui pourrait faire l'objet d'une petite interprétation (par exemple, les permissions du répertoire de téléchargement ont-elles changé?). Ceci est un inconvénient de cette méthode).

Comment définir des autorisations sur le fichier distant? La façon la plus simple de le faire est de les définir dans le fichier local, puis de les conserver lorsque vous effectuez le téléchargement. Le Net de Ruby :: SCP README dit qu'il peut en effet "préserver les attributs de fichier à travers les transferts".

9

Vous ne pouvez pas faire cela avec scp. Cependant, vous pouvez le faire avec sftp. Il ressemblerait à quelque chose comme ceci:

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 
+0

La ligne 'sftp.stat! (...)' soulèvera une exception si le 'remote_path' n'existe pas. Il devrait dire 'sftp.stat (...)' – Karl