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

9

Eu tenho este problema onde um cliente nosso tem truncado dados SFTP-ing. Não tenho certeza se o problema está do nosso lado ou dele. Eu habilitei o registro SFTP, mas ele não permite detectar se um upload foi interrompido.

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

Eu acho que algo como um prefixo .part funcionaria, mas olhando para outras postagens na falha do servidor, eu não acho que é possível com o servidor sftp do OpenSSH.

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

    
por surjikal 15.12.2014 / 11:42

1 resposta

8

Eu assumo que por "cliente sftp" você se refere a um cliente OpenSSH SFTP. O "problema" é que quando você pressiona Ctrl + C , ele pára o upload e fecha de forma limpa o arquivo remoto, como se o upload tivesse terminado completamente (note que é um comportamento correto e muitos outros SFTP os clientes se comportam da mesma forma). Então o servidor não tem absolutamente nenhum jeito de dizer que o upload foi interrompido.

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

Veja process_open em 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 declaração logit 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. Embora alguns clientes de SFTP enviem-no (por exemplo, OpenSSH ou WinSCP), alguns não o farão (por exemplo, PSFTP, FileZilla ou LFTP). Nesse caso, você receberá 0 em a->size .

Se o cliente realmente abortasse o upload (sem fechar o arquivo remoto corretamente, por exemplo, quando sftp é eliminado), você seria capaz de dizer o prefixo "forçado" para "fechar" o registro:

forced close "/data/README.md" bytes read 0 written 5366

    
por 15.12.2014 / 12:21

Tags