いくつかのファイルタイムスタンプを確認したいサードパーティの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 -l
は08: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はsftp
SFTP「stat」要求を使用できます(SFTPプロトコルのように、ディレクトリリスト以外のディレクトリリスト要求は特定のファイルまたはマスクのフィルタリングをサポートしません)。 SFTP 'stat'要求への応答には、テキストリストではなく構造化メタデータのみが含まれます。したがって、この場合、クライアントは常にリストをローカルにフォーマットする必要があります。これがタイムスタンプがのタイムスタンプと一致する理由です-h
。
~について見つかった BugZilla アイテム:ユーザーの観点からは、これをバグとして見ることもできることを知っています。しかし、OpenSSHsftp
クライアントが次のようなものを提供したい場合は、一貫性の-h
ために常にリストをローカルにフォーマットするだけです(ls
たとえば、私のWinSCPコマンドが実行する操作)。ただし、サーバー側のリストに含まれる潜在的に有用な(プラットフォーム固有/排他的な)情報の表示を放棄します。