Je télécharge un fichier sur un serveur distant à l'aide de SCP, mais quelle est la meilleure façon de voir si ce fichier existe avant de le faire?Utilisation de Ruby et SCP/SSH, comment déterminer si un fichier existe avant de télécharger une copie
Répondre
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".
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
Ceci répond définitivement à votre question et vous donnera également des informations supplémentaires. http://ruby.about.com/od/ssh/ss/netscp.htm
La ligne 'sftp.stat! (...)' soulèvera une exception si le 'remote_path' n'existe pas. Il devrait dire 'sftp.stat (...)' – Karl