SFTP“ls -l”与“ls -lh”中的不同时间戳

SFTP“ls -l”与“ls -lh”中的不同时间戳

我有一个第 3 方 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:49UTC 时间,而08:49柏林时间。

但是,我的机器使用 UTC:

$ cat /etc/timezone 
Etc/UTC

我的理解是,根据SFTP标准,所有时间戳都应该是UTC。但是我不确定这种理解是否正确(鉴于该标准有很多不同的版本)。我也不知道该sftp工具是否以某种方式对时间戳进行后处理(man sftp根本没有提到时区或时间戳)。

造成差异的原因可能是什么?

答案1

当使用 SFTP 协议列出目录时,服务器提供文件的结构化元数据(名称、时间戳、大小等)和文件的文本列表。

sftp带开关的OpenSSH-l打印文本表示(由服务器格式化)。在这种情况下,时间是根据服务器的时区打印的(至少对于 OpenSSH 服务器而言)。

但使用-hswitch 时,客户端必须自行格式化结构化元数据中的列表(由于强制自定义大小格式),包括时间戳。这就是差异的来源。 OpenSSHsftp客户端根据其时区格式化时间戳。


当“列出”特定文件时,OpenSSHsftp可能使用SFTP“stat”请求(不是目录列表,如在SFTP协议中,目录列表请求不支持过滤到特定文件或掩码)。对 SFTP“stat”请求的响应仅包含结构化元数据,而不包含文本列表。因此在这种情况下,客户端始终必须在本地格式化列表。这就是时间戳与 的时间戳匹配的原因-h


关于您找到的 BugZilla 条目:我知道从用户的角度来看,您可能会将其视为一个错误。但是,如果 OpenSSHsftp客户端想要提供诸如-h.它所能做的就是始终在本地格式化列表以保持一致性(例如,我的 WinSCPls命令就是这样做的)。但随后它将放弃显示服务器端列表中包含的潜在有用的(平台特定/专有)信息。

相关内容