Mecanismo de locking de archivos SFTP

¿Cómo puedo asegurarme de que un archivo cargado a través de SFTP (en un sistema base de Linux) permanece bloqueado durante la transferencia para que un sistema automatizado no lo lea?

¿Hay una opción en el lado del cliente? O del lado del servidor?

El protocolo SFTP admite el locking desde la versión 5. Consulte la especificación .

No especificó qué servidor SFTP está usando. Entonces asumo el más extendido, el OpenSSH. OpenSSH solo es compatible con SFTP versión 3, por lo que no es compatible con el locking.

De todos modos, incluso si su servidor admite el locking de archivos, la mayoría de los clientes / bibliotecas SFTP no admitirán SFTP versión 5. O incluso si lo hacen, no admitirán la función de locking. Tenga en cuenta que el locking es explícito, el cliente tiene que solicitarlo.

Hay algunas soluciones comunes para el problema:

  • Según lo sugerido por @ user1717259, puede hacer que el cliente cargue un archivo “listo” una vez que finaliza la carga. Haga que su sistema automatizado espere a que aparezca el archivo “listo”.
  • Puede tener una carpeta de “carga” dedicada y hacer que el cliente (atómicamente) mueva el archivo cargado a una carpeta “finalizada”. Haga que su sistema automatizado se vea solo en la carpeta “hecho”.
  • Tenga una convención de nomenclatura de archivos para cargar los archivos (“.filepart”) y haga que el cliente (atómicamente) cambie el nombre del archivo después de cargarlo a su nombre final. Haga que su sistema automatizado ignore los archivos “.filepart”.
    Ver (mi) artículo Bloqueo de archivos durante la carga / carga a nombre de archivo temporal, por ejemplo, de implementación de este enfoque.
  • Un hack bruto es verificar periódicamente los atributos del archivo (tamaño y tiempo) y considerar la carga finalizada, si los atributos no han cambiado durante un intervalo de tiempo.

Una forma típica de resolver este problema es cargar su archivo real y luego cargar un archivo vacío ‘done.txt’.

El sistema automatizado debe esperar a que aparezca el archivo ‘listo’ antes de intentar leer el archivo real.

Un mecanismo simple de locking de archivos para SFTP es cargar primero un archivo a un directorio (carpeta) donde el proceso de lectura no está mirando. Puede “crear” una carpeta alternativa usando el comando sftp> mkdir. Cargue el archivo en el directorio alternativo, en lugar del último directorio de destino. Una vez que se completa el comando SFTP> put, realice un movimiento como este: SFTP> mover vía_acceso_ternativo / nombre_archivo_destino / nombre_archivo . Como el “movimiento” de SFTP es solo cambiar los punteros de archivo, es atómico, por lo que es un locking efectivo.