¿Cómo detectar o registrar cargas interrumpidas con el servidor OpenSSH SFTP?

9

Tengo este problema donde un cliente nuestro ha estado SFTP-ing datos truncados. No estoy seguro de si el problema es nuestro o de él. He habilitado el registro SFTP pero no me permite detectar si se ha interrumpido una carga.

Por ejemplo, si enciendo el cliente sftp y presiono ^Cen el medio de la carga, el servidor solo dice algo como close "/data/README.md" bytes read 0 written 5366, que no se puede distinguir de una carga ininterrumpida.

Supongo que algo así como un .partprefijo funcionaría, pero al mirar otras publicaciones por falla del servidor, no creo que sea posible con el servidor sftp de OpenSSH.

Entonces, ¿hay alguna manera de detectar si se ha interrumpido la carga de un archivo?

surjikal
fuente

Respuestas:

8

Supongo que por "cliente sftp" se refiere a un cliente OpenSSH SFTP. El "problema" es que cuando presiona Ctrl+C, detiene la carga y cierra limpiamente el archivo remoto, como si la carga hubiera finalizado por completo (tenga en cuenta que es un comportamiento correcto y muchos otros clientes SFTP se comportan igual). Por lo tanto, el servidor no tiene absolutamente ninguna manera de decir que la carga se interrumpió.


Bueno, estrictamente hablando, ya que el cliente OpenSSH envía una pista de tamaño al servidor al crear el archivo. Pero el servidor OpenSSH no usa ni registra esa información. Aunque sería bastante simple modificar su código para registrar el tamaño, si esa es una opción para usted.

Ver process_openen sftp-server.c:

a = get_attrib();
flags = flags_from_portable(pflags);
mode = (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) ? a->perm : 0666;
logit("open \"%s\" flags %s mode 0%o",
    name, string_from_portable(pflags), mode);

Cambie la logitdeclaración a:

logit("open \"%s\" flags %s mode 0%o size %llu",
    name, string_from_portable(pflags), mode, (unsigned long long)a->size);

Tenga en cuenta que enviar la sugerencia de tamaño es opcional. Mientras que algunos clientes SFTP lo enviarán (por ejemplo, OpenSSH o WinSCP), otros no (por ejemplo, PSFTP, FileZilla o LFTP). En tal caso, obtendrá 0 en a->size.


Si el cliente realmente hubiera abortado la carga (sin cerrar el archivo remoto de forma limpia, por ejemplo, cuando sftpse elimina), podría distinguirlo del prefijo "forzado" al registro "cerrado":

forzado cerrar "/data/README.md" bytes leídos 0 escritos 5366

Martin Prikryl
fuente
1
Wow, hiciste winSCP ?? Big ups amigo. Gracias por la respuesta, lo haré.
surjikal