간만의 휴식에 한일들

 3월 1일부터 새로운 회사에 입사하게 되어서 2월은 약 한달 정도 쉬게 되었다. 쉬기 전 까지는 이것도 하고 저것도 하고 계획도 많았지만 막상 쉬게 되면 이런 저런 제약 때문에 생각대로 되지 않는다. 특히 꼬맹이 학교에서 돌아오는 시간이 있으니 그에 맞춰 집에 있으려면 할 수 있는 것도 그렇게 많지 않은 것 같다. 그나마 한 것 들이라고는 영화본 것 밖에 없는 듯. 슬램덩크, 아바타2, 앤트맨&와스프 퀀텀 매니아. 요렇게 3개의 영화를 보고 왔다. 슬램덩크 추억의 만화책을 애니화 한 만화 영화. 뭐 나쁘지 않은 영화 였다. 전체적으로는 약간 루즈한 느낌이 들지만 마지막 클라이막스 부분에서는 음악과 함께 좋은 연출을 본 듯 한 느낌이다. 두번 본 사람도 있다고 하는데 그 정도 까지는 아닌 듯. 아바타2 볼까 말까 고민한 영화. 이미 뒷편 들까지 어느정도 촬영이 끝났다는 이야기를 듣고 보기로 결정. 처음으로 4dx 영화관에서 보았는데 의자의 흔들림 등 그 외 효과들이 그렇게 효과가 있다고는 생각을 못하겠다. 가~끔씩 타이밍이 딱 맞을 때도 있지만 오히려 신경이 쓰여서 영화에 집중 못하는 경우도 꽤 있었던 듯 하다.  화면에 집중하고 싶어서 더빙판으로 관람 했는데 더빙 판은 4dx밖에 없드라.. 내용도 괜찮고 그래픽도 괜찮고 눈도 즐거웠다. 다음 편이 나오면 또 보러 가고 싶다. 앤트맨&와스프 퀀텀 매니아 인터넷의 평가는 좋은편이 아닌 듯 하다. 이것도 4dx로 관람 하고 왔는데 나쁘지는 않은 듯 하다. 딱 거기까지. 양자 세계에 또하나의 우주가 존재한다는 가설은 이전부터 있었던 이야기. 결국 우리가 살고 있는 지구도 누군가의 양자 세계 일 수도 있다는 것.  하지만 양자 세계의 묘사가 뭐랄까 스타워즈 짝퉁이라는 느낌이 강하게 든다. 스타워즈를 본 적 없는 사람에게는 신선한 충격으로 다가 올지도 모르겠다. 영화를 볼때는 개연성같은걸 신경 쓰면 지는 거다. 그냥 무지성으로 생각하지 말고 시간 때우기로만 본다면 나쁘진 않은 듯 하지만 하나씩 따지기 시작

sftp에서 파일과 디렉토리의 ls 결과에 대해

sftp로 파일을 전송하다가

조금 이상한 일을 겪었다. sftp로 서버에 접속한 후 파일을 전송하고 디렉토리를 “ls -l” 로 확인했을 때와 디렉토리내의 파일을 직접 “ls -l”로 확인했을때, 파일의 timestamp가 틀리게 나오는 걸 확인했다. sftp 클라이언트와 sftp 서버 쪽 timezone을 확인 해 본 결과 sftp 클라이언트는 timezone이 Asia/Tokyo 였고, sftp 서버쪽의 timezone은 UTC로 설정되어 있는게 이유가 아닐까 싶어 확인을 해 보았다.

 

timezone 변경과 확인

먼저 서버쪽에 ssh 로그인 후 timedatectl 로 확인해 본결과 역시나 UTC로 설정되어 있었다. timedatectl set-timezone Asia/Tokyo 명령어로 서버쪽 timezone도 클라이언트와 동일하게 설정해 주니 ls -l 로 디렉토리와 파일을 지정했을때 timestamp 가 엉뚱하게 나오는 현상은 해결 되었다. 

그런데 문제는 해결 되었는데 도대체 왜 이런 현상이 발생하는지 이해가 안간다. 디렉토리와 파일 모두 timestamp 가 동일하게 나온다면 그러려니 하겠는데 디렉토리와 파일에 대해 ls -l 을 실행한 결과가 다르게 나온다는건 조금 이해가 되지 않는다. 인터넷을 검색해 보아도 특별히 보고된 issue 같은 건 없는 듯 하니… 소스 파일을 직접 검색해 보는 수 밖에 없을려나.

 

sftp 소스 분석

sftp 의 소스 파일은 어디에서 받을 수 있을까. 검색 결과 https://www.openssh.com/ 에서 다운 받을 수 있었다. 미러 리스트로부터 적당한 링크를 클릭하여 wget 으로 openssh-8.0p1.tar.gz 파일을 다운 받아 압축 해제를 하고 소스를 확인 하였다. 관련 있는 함수는 sftp-common.c 파일의 ls_file()과 sftp-client.c의 do_readdir() 함수 정도 일려나.

do_lsreaddir(struct sftp_conn *conn, const char *path, int print_flag,
     SFTP_DIRENT ***dir)
 {
   struct sshbuf *msg;
   u_int count, id, i, expected_id, ents = 0;
   size_t handle_len;
   u_char type, *handle;
   int status = SSH2_FX_FAILURE;
   int r;
... 생략 ...

sftp-client.c 의 do_readdir()은 do_lsreaddir()을 불러오고 있어서 do_lsreaddir()을 확인해 보았지만 특별히 눈에 띄이는 점은 없다. 다음으로 sftp-common.c 파일을 확인 해보았다.

ls_file(const char *name, const struct stat *st, int remote, int si_units)
{
   int ulen, glen, sz = 0;
   struct tm *ltime = localtime(&st->st_mtime);
   const char *user, *group;
   char buf[1024], lc[8], mode[11+1], tbuf[12+1], ubuf[11+1], gbuf[11+1];
   char sbuf[FMT_SCALED_STRSIZE];
   time_t now;
... 생략 ...

헐… 자세히는 모르겠지만 파일의 stat로부터 localtime 을 적용시키고 있는 듯 하다. 그렇다면 설명이 된다.ls -l로 디렉토리를 지정했을 경우에는 ls 의 결과를 그대로 받아와서 출력하지만 파일을 지정했을 경우엔 localtime 으로 변경후 반환해 주는 듯 하다. 할려면 똑같이 해줬으면 좋겠는데… 어느쪽이 맞냐고 한다면… 서버 쪽의 timestamp 를 그대로 반환해 주었으면 좋겠는데 말야…

 

다음에 시간 나면 소스를 수정하여 컴파일 한 후에 제대로 동작하는지 테스트 해보고 싶다. 시간에 여유가 생겨서 해볼 수 있다면 다시 결과를 남기도록 하겠다.

댓글

이 블로그의 인기 게시물

curl 명령어 옵션

CISCO 2960s 초기화 후 기본 설정

맥북 카라비너 영어/한글/일본어 전환하기