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
如您所見,時間戳 in
ls -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 命令就是這樣做的)。但隨後它將放棄顯示伺服器端列表中包含的潛在有用(平台特定/專有)資訊。