我有一个第 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:49
UTC 时间,而08:49
柏林时间。
但是,我的机器使用 UTC:
$ cat /etc/timezone
Etc/UTC
我的理解是,根据SFTP标准,所有时间戳都应该是UTC。但是我不确定这种理解是否正确(鉴于该标准有很多不同的版本)。我也不知道该sftp
工具是否以某种方式对时间戳进行后处理(man sftp
根本没有提到时区或时间戳)。
造成差异的原因可能是什么?
答案1
当使用 SFTP 协议列出目录时,服务器提供文件的结构化元数据(名称、时间戳、大小等)和文件的文本列表。
sftp
带开关的OpenSSH-l
打印文本表示(由服务器格式化)。在这种情况下,时间是根据服务器的时区打印的(至少对于 OpenSSH 服务器而言)。
但使用-h
switch 时,客户端必须自行格式化结构化元数据中的列表(由于强制自定义大小格式),包括时间戳。这就是差异的来源。 OpenSSHsftp
客户端根据其时区格式化时间戳。
当“列出”特定文件时,OpenSSHsftp
可能使用SFTP“stat”请求(不是目录列表,如在SFTP协议中,目录列表请求不支持过滤到特定文件或掩码)。对 SFTP“stat”请求的响应仅包含结构化元数据,而不包含文本列表。因此在这种情况下,客户端始终必须在本地格式化列表。这就是时间戳与 的时间戳匹配的原因-h
。
关于您找到的 BugZilla 条目:我知道从用户的角度来看,您可能会将其视为一个错误。但是,如果 OpenSSHsftp
客户端想要提供诸如-h
.它所能做的就是始终在本地格式化列表以保持一致性(例如,我的 WinSCPls
命令就是这样做的)。但随后它将放弃显示服务器端列表中包含的潜在有用的(平台特定/专有)信息。