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_open
en 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 logit
declaració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 sftp
se elimina), podría distinguirlo del prefijo "forzado" al registro "cerrado":
forzado cerrar "/data/README.md" bytes leídos 0 escritos 5366