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

이미지
 현재 Intel 맥북과 M1 맥북에서 4종류의 키보드를 사용중이다. HHK RealForce MD770 Keychron K12 마음 가는대로 키보드를 바꿔가며 사용중인데 매번 설정을 바꾸는게 고역이다. 특히 한글/영어/일본어 간의 변환은 스무즈하게 바꿀 수 없다면 타이핑 하는데 꽤나 고역이다. 그래서 카라비너를 이용한 변환키 설정을 기록한다. 기본 컨셉은 일본어 배열 키보드와 영어 배열 키보드에서 간단하게 각 언어 변환이 가능할 것. 일본어 키보드의 경우는 스페이스바 왼쪽의 키를 한번 누르면 영어, 스페이스바 오른쪽의 키를 누르면 일본어, 연속으로 두번 누르면 한글로 바뀌는 설정이고, 영어 배열 키보드에서는 왼쪽쉬프트+스페이스바가 영어, 오른쪽쉬프트+스페이스가 일본어, 오른쪽 커맨드키를 두번 누르면 한글이 되는 설정이다. Keychron K12(영어배열) + Macbook M1 카라비너 설정 / Simple Modificiations   카라비너 설정 / Complex modifications { "title" : "한글전환 커스텀 For M1 " , "rules" : [ { "description" : "영어 키보드 - 좌측Shift+스페이스:영어, 우측Shift+스페이스:히라가나, 우측 커맨드키 더블클릭:한글" , "manipulators" : [ { "type" : "basic" , "from" : { "key_code" : "spacebar" , "modifiers" : { "mandatory" : [

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 를 그대로 반환해 주었으면 좋겠는데 말야…

 

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

댓글

이 블로그의 인기 게시물

CISCO 2960s 초기화 후 기본 설정

curl 명령어 옵션

해외거주 국민을 위한 "교민폰" 사용후기