Usando Ruby y SCP / SSH, cómo determinar si existe un archivo antes de cargar una copia

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

  •  06-07-2019
  •  | 
  •  

Pregunta

Estoy cargando un archivo a un servidor remoto usando SCP, pero ¿cuál es la forma correcta de ver si ese archivo existe antes de hacerlo?

¿Fue útil?

Solución

Cuidado con check-then-upload: esto no es atómico y puede conducir a condiciones de carrera (o vulnerabilidades TOCTOU).

Una mejor manera de avanzar podría ser establecer los permisos de archivo en el archivo cargado para que no se pueda escribir (400 o 444 o similar en sistemas similares a UNIX), luego cualquier carga posterior al mismo nombre de archivo simplemente fallará. (Obtendrá un "permiso denegado" que puede estar sujeto a una pequeña interpretación (por ejemplo, ¿cambiaron los permisos del directorio de carga?). Esto es una desventaja de este método).

¿Cómo se configuran los permisos en el archivo remoto? La forma más sencilla de hacerlo es establecerlos en el archivo local y luego preservarlos cuando realice la carga. Ruby's Net :: SCP README dice que puede de hecho " preservar los atributos del archivo en las transferencias " ;.

Otros consejos

No puedes hacer esto con scp. Sin embargo, puede hacerlo con sftp. Se vería así:

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

Esto definitivamente resuelve su pregunta y también le dará información adicional. http://ruby.about.com/od/ssh/ss/netscp.htm

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top