Como detectar ou registrar uploads interrompidos com o servidor SFTP do OpenSSH?


9

Eu tenho esse problema em que um cliente nosso tem dados truncados no SFTP. Não tenho certeza se o problema está do nosso lado ou dele. Eu ativei o registro SFTP, mas ele não me permite detectar se um upload foi interrompido.

Por exemplo, se eu inicializar o cliente sftp e clicar ^Cno meio do upload, o servidor diz algo como isso close "/data/README.md" bytes read 0 written 5366, que é indistinguível de um upload ininterrupto.

Eu acho que algo como um .partprefixo funcionaria, mas olhando para outras postagens com falha no servidor, não acho que seja possível com o servidor sftp do OpenSSH.

Então, existe uma maneira de eu detectar se um upload de arquivo foi interrompido?

Respostas:


8

Eu assumo que por "cliente sftp" você se refere a um cliente SFTP do OpenSSH. O "problema" é que, quando você pressiona Ctrl+C, ele interrompe o upload e fecha o arquivo remoto de maneira limpa, como se o upload estivesse completamente concluído (observe que esse é um comportamento correto e muitos outros clientes SFTP se comportam da mesma maneira). Portanto, o servidor não tem absolutamente nenhuma maneira de dizer que o upload foi interrompido.


Estritamente falando, o cliente OpenSSH envia uma dica de tamanho ao servidor ao criar o arquivo. Mas o servidor OpenSSH não usa nem mesmo registra essas informações. Embora seja bastante simples modificar seu código para registrar o tamanho, se essa for uma opção para você.

Veja process_openem 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);

Altere a logitdeclaração para:

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

Observe que o envio da dica de tamanho é opcional. Enquanto alguns clientes SFTP o enviarão (por exemplo, OpenSSH ou WinSCP), outros não (por exemplo, PSFTP, FileZilla ou LFTP). Nesse caso, você receberá 0 pol a->size.


Se o cliente realmente tivesse abortado o upload (sem fechar o arquivo remoto corretamente, por exemplo, quando o arquivo sftpfor morto), você seria capaz de diferenciá-lo do prefixo "forçado" para "fechar" o registro:

bytes forçados de fechamento "/data/README.md" lidos 0 gravados 5366


1
Uau, você fez winSCP ?? Big ups, cara. Obrigado pela resposta, eu vou fazer isso.
surjikal
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.