ssh 접속이 오래 걸린다? 문제는 zsh/exa 에 있었다.

언젠가부터 ssh 접속을 하면, 접속 자체는 빨리 이뤄지지만 정작 프롬프트가 떨어지기까지 꽤 오랜 시간이 걸리기 시작했다. 대략 수초 정도 걸리는 듯 한데, 그냥 그렇게 내버려두고 쓰고 있다가 오늘 날을 잡고 원인을 분석해보기 시작했다.

먼저, ssh 접속 자체에 문제가 있을 수도 있다. 우회책은 크게 두가지(GSSAPIAuthentication, UseDNS)인 모양인데.. 난 이것들과는 별 관계가 없었다.
이런 저런 삽질을 하다가, 문제 원인이 exa 에 있음을 찾을 수 있었다. 그래, 그 때부터였구나…

** 2023.01.25 정확한 원인은 모른다!

아래에 있는 방법대로 exa 를 수정해봤지만, 또 여전히 가끔 접속이 오래걸리곤 한다.
다시 검색을 해봤고, 그 결과 ssh ChallengeResponseAuthentication 이 문제의 원흉(?)일 수도 있다는 사실을 알았다.
그래서 이걸 no 로 바꾸고 실행해보니 빨라지긴 했는데.. (물론, 시험 횟수가 적기 때문에 확실한 대처법이었다고 말할 순 없다.) 문제는 이 값이 이전에도 no 였다는데 있다.
이게 뭔 소린고 하니..

/etc/ssh/sshd_config 의 이 값은 주석처리돼 있었고, 기본값은 ‘no’ 이다. sudo sshd -T | grep -i challenge 로 확인해보면 주석처리돼 있어도 no 로 나옴을 알 수 있다. 내가 한 일은 주석을 지우고 이 값을 확실히 ‘no’ 로 바꿨을 뿐인데, ssh 접속 시간이 빨라졌다. (이게 있을 수 있는 일인가..???)
아무튼, exa autocompletion 은 oh-my-zsh 로 적용된 상태에서, ChallengeResponseAuthentication 만 ‘no’ 로 명시해줬을 뿐인데 ssh 접속시 프롬프트가 늦게 뜨는 현상이 사라졌다. (며칠 뒤 다시 또 같은 현상이 나타날지도..)

사실, exa 자체에 문제가 있다기 보다는, exa 가 제공하는 자동완성(completion) 기능을 내가 잘 적용하지 못했던 데 원인이 있다고 봐야겠다.

단지 exa 만이 아니고, zsh, oh-my-zsh 등을 쓸 때 이렇게 반응이 느려지는 문제가 사람들을 많이 괴롭게 하는 모양이다. 이 문제를 해결하려고 노력한, 이런 저런 글들을 많이 찾을 수 있었다. 그러다가, 결국 내 문제의 원흉(?)이 된 compinit 을 발견하게 되었는데.. 연결된 글에 있는 해법은, 내 상황에선 제대로 적용되지 않았다. (이유는 모르겠다.)

zsh 작업 시간 측정

일련의 삽질 끝에 알아낸 방법인데, zmodload zsh/zprofzprof 를 사용하면 zsh 시작 시 작업 시간을 자세히 볼 수 있다. 이 결과가 compinit 이었다.

exa?

이전에 쓴 글에서, exa 가 제공하는 autocompletion 을 이용하려면, 디렉토리를 만들어 fpath 에 추가하고, 다음 명령을 .zshrc 에 넣는 방법을 택했었다.

fpath+=("$HOME/.zfunc")
autoload -Uz compinit
compinit

compinit 은 .zcompdump 를 만드는 명령인데, 이게 매번 실행되다 보니 그 시간만큼 기다려야만 했다.
이를 해결하기 위해서 .zcompdump 가 생성된 시간을 확인한 뒤 작업하는 방식을 택했지만, 그도 제대로 작동하질 않았다.
oh my zsh 문서를 보니, compinit 은 자동으로 실행된다고 하므로, 저 명령을 굳이 .zshrc 에 넣어줄 필요는 없을 듯 하다.

어찌됐든, 이 난관을 헤쳐나갈 방법은 두가지.
하나는 전역에 넣는 방법, 또 하나는 정말 코끼리 뒷걸음질 치다 쥐잡은 격이지만, ~/.oh-my-zsh/completions 에 넣 는 법. 이건 oh-my-zsh 를 쓸 때에만 유효하다.
다만, 이 디렉토리는 기본 생성돼 있지 않다. fpath (echo $fpath 로 확인)엔 설정돼 있는데, 디렉토리는 없다. 따라서 만들어줘야만 한다.

# 전역
sudo cp _exa /usr/local/share/zsh/site-functions

# 사용자
mkdir ~/.oh-my-zsh/completions
cp _exa ~/.oh-my-zsh/completions

** 그래도 문제는 있다.

왜 그런진 모르지만, 어떤 시스템에선 이 설정을 해놓으면, ssh 접속 시에 프롬프트가 뜨기까지 수십초가 소요되는 경우가 있다. 해결책은 찾질 못했다.

zsh 재시작

보통, Shell 을 재시작하려면 source ~/.zshrc 를 사용하라곤 한다.
그런데, oh my zsh 문서에선 이건 좋은 선택이 아니라고 한다. 터미널을 다시 열거나, 아니면 exec zsh 로 재시작하는게 좋다고 한다.


글을 마치고 보니 ssh 문제가 아니라 exa 해법이 되고 말았으나..

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.