curl 명령어 옵션

# 결과를 지정한 이름으로 파일에 저장 $ curl -o response.txt https://www.example.net # 결과를 파일이름으로 저장, index.html 이 저장됨  $ curl -O https://www.example.net/index.html # SSL증명서 에러 무시 $ curl -k https://www.example.net # 진척상황을 표시 하지 않기, 에러도 표시되지 않음 $ curl -s -o response.txt http://www.example.net # 에러메시지는 보고 싶을때 $ curl -sS -o response.txt http://www.example.net # progress bar로 진척상황표시 $ curl -# -O http://www.example.net/index.html # proxy이용시 $ curl -x <proxyip>:<port> --proxy-user <username>:<password> http://www.example.net $ curl -x <username>:<password>@<proxyip>:<port> http://www.example.net # 301/302등의 redirect를 자동인식 $ curl -L http://www.example.net # http의 메소드를 지정 $ curl -X [PUT|GET|POST] http://www.example.net # parameter를 POST로 송신 $ curl -w '\n' 'http://www.example.net/posturl' -X POST --data 'name=myname&mode=create' # status code만 출력 $ curl -sS -w '%{http_code}\n' http://www.example.net  # http의 response header를 확인

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 초기화 후 기본 설정