SFTP「ls -l」と「ls -lh」のタイムスタンプが異なります。

SFTP「ls -l」と「ls -lh」のタイムスタンプが異なります。

いくつかのファイルタイムスタンプを確認したいサードパーティのSFTPサーバーがあります。

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

ご覧のとおり、タイムスタンプls -l08:49で、他のコマンドにはタイムスタンプがあります07:49。サーバーはドイツにあり、現在UTCより1時間遅れているため、ベルリン時間では07:49なくUTC時間のようです08:49

しかし、私のコンピュータはUTCを使用しています。

$ cat /etc/timezone 
Etc/UTC

私が理解したように、SFTP標準によると、すべてのタイムスタンプはUTCでなければなりません。しかし、これらの理解が正しいかどうかはわかりません(標準のさまざまなバージョンがあることを考えると)。また、sftpツールがどのようにしてタイムスタンプを後処理するのかわかりません(タイムゾーンやman sftpタイムスタンプはまったく言及されていません)。

違いがあるのはなぜですか?

答え1

SFTPプロトコルを使用してディレクトリを一覧表示すると、サーバーはファイルの構造化メタデータ(名前、タイムスタンプ、サイズなど)とファイルのテキストリストを提供します。

sftpスイッチ付きのOpenSSHは-lテキスト表現(サーバー形式)を印刷します。この場合、時間はサーバーのタイムゾーンに従って印刷されます(少なくともOpenSSHサーバーの場合)。

ただし-h、スイッチを使用する場合、クライアントはタイムスタンプを含む構造化メタデータ自体でリスト形式を指定する必要があります(強制カスタムサイズ形式のため)。ここで違いが発生します。 OpenSSHsftpクライアントは、タイムゾーンに従ってタイムスタンプ形式を指定します。


特定のファイルを「開く」場合、OpenSSHはsftpSFTP「stat」要求を使用できます(SFTPプロトコルのように、ディレクトリリスト以外のディレクトリリスト要求は特定のファイルまたはマスクのフィルタリングをサポートしません)。 SFTP 'stat'要求への応答には、テキストリストではなく構造化メタデータのみが含まれます。したがって、この場合、クライアントは常にリストをローカルにフォーマットする必要があります。これがタイムスタンプがのタイムスタンプと一致する理由です-h


~について見つかった BugZilla アイテム:ユーザーの観点からは、これをバグとして見ることもできることを知っています。しかし、OpenSSHsftpクライアントが次のようなものを提供したい場合は、一貫性の-hために常にリストをローカルにフォーマットするだけです(lsたとえば、私のWinSCPコマンドが実行する操作)。ただし、サーバー側のリストに含まれる潜在的に有用な(プラットフォーム固有/排他的な)情報の表示を放棄します。

関連情報