Search

SSH 연결은 되지만 SFTP는 안될 때

요약
.bashrc에 표준 출력 명령어를 넣지 말 것
게시일
2021/01/28
태그
Mac
Linux
1 more property
SSH로 연결해 잘 쓰던 리눅스 서버에 SFTP로는 연결이 안 될 때, 무엇이 문제일까?
검색해보면 가장 많은 답은 이렇다.
#Subsystem sftp /usr/lib/openssh/sftp-server Subsystem sftp internal-sftp
Bash
복사
이게 왜 해결책인지 제시하는 건 못봤다. 이렇게 문제를 해결한 들, sftp를 늘 저렇게 설정해서 쓰는 것이 최선일까?
정확한 이유는 여기에서 찾을 수 있다: https://access.redhat.com/solutions/1553663. 결론만 말하자면,
1.
.bashrc 파일과 .bash_profile 파일을 잘못 사용해서 발생하는 문제
2.
sftp 클라이언트가 원격 호스트로부터 받은 stdout 메시지를 제대로 처리할 수 없기 때문
나는 neofetch 명령을 실행하도록 .bashrc 파일을 구성하고 나서 sftp 연결을 할 수 없었다.
사용자의 non-login 설정 파일인 .bashrc에 입력한 명령어가 표준 출력을 하는 경우, sftp 로그인 세션에서 제대로 처리하지 못하고 이런 메시지를 볼 수 있다.
Received message too long 458964786 Ensure the remote shell produces no output for non-interactive sessions.
Plain Text
복사
사용자와 상호작용하는 쉘(login-shell, interactive session)이 사용하는 환경 설정 파일은 .bash_profile이다. .bashrc에서 표준 출력을 실행하는 명령어들을 .bash_profile로 옮겨 놓아야 한다.

Login Shell? Non-login Shell?

간단히,
Login Shell: 사용자가 로그인할 때 실행되는 쉘. .bash_profile 환경 설정 파일을 이용한다.
Non-login shell: 사용자 로그인 없이 실행되는 쉘. .bashrc 환경 설정 파일을 이용한다.
사용자 로그인 없이 실행하는 쉘은 최소한의 실행 환경이 필요하고, 로그인 쉘은 사용자의 필요에 따라 환경을 구성할 수 있어야 한다.
리눅스에서 .bash_profile은 실행할 때 먼저 .bashrc를 실행한다. 다음은 RHEL 8의 기본 .bash_profile이다.
# .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs
Bash
복사
이제 어지간한 설정은 .bashrc 보다 .bash_profile을 이용하자.