Eu tenho um servidor SFTP de terceiros no qual quero verificar alguns carimbos de data/hora de arquivos.
No entanto, obtenho resultados diferentes para o mesmo arquivo se usar ls -l
vs. ls -lh
:
sftp> ls -l
[...]
-rwxrwxrwx 1 0 0 1963 Nov 15 08:49 foo.txt
[...]
sftp> ls -lh
[...]
-rwxrwxrwx 0 0 0 1.9K Nov 15 07:49 foo.txt
[...]
sftp> ls -l foo.txt
-rwxrwxrwx 0 0 0 1963 Nov 15 07:49 foo.txt
sftp> ls -lh foo.txt
-rwxrwxrwx 0 0 0 1.9K Nov 15 07:49 foo.txt
Como você pode ver, o timestamp ls -l
é 08:49
enquanto os outros comandos têm 07:49
. O servidor está na Alemanha, que atualmente é 1h depois do UTC, então meu palpite é que 07:49
é UTC, enquanto 08:49
é o horário de Berlim.
No entanto, minha máquina está em UTC:
$ cat /etc/timezone
Etc/UTC
Meu entendimento é que, de acordo com o padrão SFTP, todos os timestamps devem estar em UTC. No entanto, não tenho certeza se esse entendimento está correto (dado que existem tantas versões diferentes do padrão). Eu também não sei se a sftp
ferramenta de alguma forma pós-processa os carimbos de data/hora ( man sftp
não menciona fusos horários ou carimbos de data/hora).
Qual poderia ser o motivo da diferença?
Ao listar um diretório usando o protocolo SFTP, o servidor fornece metadados estruturados de arquivos (nome, carimbo de data/hora, tamanho etc.) e uma lista textual de arquivos.
O OpenSSH
sftp
com-l
switch imprime a representação textual (conforme formatado pelo servidor). Neste caso os horários são impressos de acordo com o fuso horário do servidor (pelo menos com o servidor OpenSSH).Mas com
-h
o switch, o cliente precisa formatar a listagem a partir dos metadados estruturados por conta própria (devido à formatação personalizada forçada do tamanho), incluindo o carimbo de data/hora. É daí que vem a diferença. O cliente OpenSSHsftp
formata os timestamps de acordo com seu fuso horário.Ao "listar" arquivos específicos, o OpenSSH
sftp
provavelmente usa a solicitação "stat" do SFTP (não uma listagem de diretórios, como no protocolo SFTP, a solicitação de listagem de diretórios não suporta filtragem para um arquivo específico ou uma máscara). A resposta à solicitação "stat" do SFTP contém apenas os metadados estruturados, não a listagem textual. Portanto, neste caso, o cliente sempre precisa formatar a listagem localmente. Então é por isso que o timestamp corresponde ao timestamp de-h
.Em relação à entrada do BugZilla, você encontrou : Eu entendo que, da perspectiva do usuário, você pode vê-lo como um bug. Mas não há muito que o
sftp
cliente OpenSSH possa fazer sobre isso, se quiser oferecer recursos de formatação como-h
. Tudo o que ele pode fazer é sempre formatar a listagem localmente para manter a consistência (é o que o comando ls do meu WinSCP faz, por exemplo). Mas então ele desistiria de exibir informações potencialmente úteis (específicas/proprietárias da plataforma) contidas na listagem do lado do servidor.