Usando Ruby e SCP / SSH, como determinar se um arquivo existe antes de carregar uma cópia
-
06-07-2019 - |
Pergunta
Estou fazendo upload de um arquivo para um servidor remoto usando SCP, mas o que é a maneira correta de ver se esse arquivo existe antes de fazê-lo?
Solução
Cuidado com check-então-upload:. Isso não é atômica e pode levar a condições de corrida (ou vulnerabilidades TOCTOU)
A melhor maneira para a frente poderia ser a de definir as permissões de arquivo do arquivo enviado para que ele não é gravável (400 ou 444 ou similar em UNIX-like sistemas), então quaisquer envios subseqüentes para o mesmo nome de arquivo simplesmente falhará. (Você vai ter "permissão negada" back que pode estar sujeito a um pouco de interpretação (por exemplo, fez o upload de mudança permissões de diretório?). Esta é uma desvantagem para este método).
Como você definir as permissões sobre o arquivo remoto? A maneira mais simples de fazer isso é colocá-las no arquivo local e, em seguida, preservá-los quando você faz o upload. Net Ruby :: SCP README diz que ele pode na verdade, "preservar atributos de arquivo através de transferências".
Outras dicas
Você não pode fazer isso com scp. No entanto, você pode fazê-lo com sftp. Seria algo parecido com isto:
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
Isso definitivamente resolve a sua pergunta e dará informação extra também. http://ruby.about.com/od/ssh/ss/netscp.htm