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