Utilizzando Ruby e SCP / SSH, come determinare se esiste un file prima di caricarne una copia

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

  •  06-07-2019
  •  | 
  •  

Domanda

Sto caricando un file su un server remoto utilizzando SCP, ma qual è il modo corretto di vedere se quel file esiste prima di farlo?

È stato utile?

Soluzione

Fai attenzione check-then-upload: questo non è atomico e può portare a condizioni di competizione (o vulnerabilità TOCTOU).

Un modo migliore per inoltrare potrebbe essere quello di impostare le autorizzazioni del file sul file caricato in modo che non sia scrivibile (400 o 444 o simile su sistemi simili a UNIX), quindi qualsiasi caricamento successivo sullo stesso nome fallirà semplicemente. (Riceverai "autorizzazione negata" che potrebbe essere soggetta a una piccola interpretazione (ad esempio, le autorizzazioni della directory di caricamento sono cambiate?). Questo è uno svantaggio di questo metodo).

Come si impostano le autorizzazioni per il file remoto? Il modo più semplice per farlo è di impostarli sul file locale e quindi conservarli quando si esegue il caricamento. Rete di Ruby :: SCP README afferma che può infatti "conserva gli attributi del file attraverso i trasferimenti".

Altri suggerimenti

Non puoi farlo con scp. Tuttavia puoi farlo con sftp. Sarebbe simile a questo:

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

Questo risolve definitivamente la tua domanda e fornirà anche informazioni extra. http://ruby.about.com/od/ssh/ss/netscp.htm

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top