SFTP "ls -l"과 "ls -lh"의 타임스탬프가 다릅니다.

SFTP "ls -l"과 "ls -lh"의 타임스탬프가 다릅니다.

일부 파일 타임스탬프를 확인하려는 타사 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 -l08: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스위치를 사용할 때 클라이언트는 타임스탬프를 포함하여 구조화된 메타데이터 자체에서 목록 형식을 지정해야 합니다(강제 사용자 정의 크기 형식으로 인해). 여기서 차이점이 발생합니다. OpenSSH sftp클라이언트는 시간대에 따라 타임스탬프 형식을 지정합니다.


특정 파일을 "나열"할 때 OpenSSH는 sftpSFTP "stat" 요청을 사용할 수 있습니다(SFTP 프로토콜에서와 같이 디렉터리 목록이 아닌 디렉터리 목록 요청은 특정 파일이나 마스크에 대한 필터링을 지원하지 않습니다). SFTP 'stat' 요청에 대한 응답에는 텍스트 목록이 아닌 구조화된 메타데이터만 포함됩니다. 따라서 이 경우 클라이언트는 항상 목록을 로컬로 형식화해야 합니다. 이것이 타임스탬프가 의 타임스탬프와 일치하는 이유입니다 -h.


~에 대한찾은 BugZilla 항목:사용자 관점에서는 이것을 버그로 볼 수도 있다는 것을 알고 있습니다. 그러나 OpenSSH sftp클라이언트가 다음과 같은 것을 제공하려는 경우 -h일관성을 위해 항상 목록을 로컬로 형식화하는 것뿐입니다( ls예를 들어 내 WinSCP 명령이 수행하는 작업). 그러나 그러면 서버 측 목록에 포함된 잠재적으로 유용한(플랫폼 특정/독점) 정보 표시를 포기하게 됩니다.

관련 정보