Usando Ruby e SCP / SSH, como determinar se um arquivo existe antes de carregar uma cópia

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

  •  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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top