.bashrc를 소싱하지 않는 SSH
.bashrcSSH를 통해 서버에 원격으로 로그인하는 동안 내 파일을 실험하고있었습니다 . 실수 exit로 모든 후속 로그인이 즉시 연결 해제되는 원인이 된 을 거기에 두었습니다 . 나는 사실상 갇혔다. 루트 권한이있는 사람의 개입으로 액세스를 복구 할 수 있었지만 다른 사람의 도움 없이는 가능했을까요?
나는 달리기 ssh <server> 'bash --norc --noprofile'와 같은 것을 시도 했고 ssh <server> 'mv .bashrc bashrc-backup', 심지어 강제로 그것을 scp empty-file <server>:.bashrc. 그러나 이러한 모든 옵션은 .bashrc명령을 실행하기 전에 먼저 손상된 항목을 소싱하는 데 의존하는 것으로 보이 므로 어느 것도 작동하지 않았습니다.
이런 상황에서 벗어날 방법이 없을 수도 있습니다. 그러나 그것은 의도적으로 설계된 것입니까? 예를 들어 실행만으로 시스템을 잠그는 것이 그렇게 쉬운 이유가 ssh <server> 'echo exit > .bashrc'있습니까? 이런 종류의 실수를 완화 할 수있는 방법이 있습니까?
답변
다른 답변에서 설명한 것처럼 SSH 클라이언트가 OpenSSH 서버에 연결할 때 OpenSSH 서버는 일반적으로 사용자의 로그인 셸을 사용하여 클라이언트를 대신하여 셸 세션을 시작합니다.
- 클라이언트가 대화 형 세션을 요청하면 서버는 사용자의 로그인 셸을 시작합니다.
- 클라이언트가 명령 실행을 요청하면 서버는 사용자의 로그인 셸을 사용하여 명령을 셸 명령으로 실행합니다.
- 유틸리티 좋아하는
scp,rsync그리고git그들이 # 2에 해당하므로, 원격 시스템에서 실행되는 명령을 요청합니다 수송하는 사용 SSH를.
원격 사용자의 셸 시작 파일에 셸이 종료되도록하는 항목이 있으면 시작하는 데 문제가 있습니다.
그러나 SFTP는 특별한 경우입니다. OpenSSH 서버 는 외부 명령을 실행하지 않고 SFTP를 지원하도록 구성 할 수 있습니다. 이 경우 sftp를 사용하여 서버에 연결 .bashrc하고 문제를 일으키는 파일을 삭제, 이름 변경 또는 변경할 수 있습니다.
sftp를 지원하도록 서버를 구성하는 방법에 따라 다릅니다. 외부 프로그램 (이름 sftp-server) 을 실행하여 sftp 세션을 서비스 할 수 있습니다 . 이 경우 .NET과 같은 프로그램을 사용하는 것과 동일한 문제가 발생 scp합니다. 또는 서버는 쉘을 호출 할 필요가없는 "internal-sftp" 라고하는 것으로 sftp 세션을 서비스 할 수 있습니다 . 특정 SSH 서버가 구성되는 방법에 따라 다릅니다.
이것이 발생하는 이유 sshd는 서버 측 구성 요소 인이 셸을 사용하여 프로세스를 호출 하기 때문 입니다. 대화 형 셸을 생성하는 경우 로그인 셸로 생성합니다. 그렇지 않으면 -c인수를 사용하여 비대화 형 셸을 생성하여 지정한 명령을 실행합니다.
지정한 모든 작업 (지정된 명령 및 scp)은 비대화 형 작업이므로 일반적으로 bash는로드되지 .bashrc않지만 bash는에서 호출 할 때 특수 케이스를 sshd사용하여 어쨌든 호출합니다. zsh를 사용하고 있다면 .zshenv(모든 쉘에 대해 호출되는)로드되지만 .zshrc(대화식 쉘에만 해당) 쉘 세션을 특별히로드하지 않는 한로드되지 않습니다.
이 경우 bash를 사용하는 경우 운이 좋지 않습니다. 쉘을 사용하지 않고 서버 측에서 SSH 명령을 호출 할 수있는 방법은 없습니다. 이것은 scp와 sftp에서도 마찬가지입니다. 대부분의 경우 셸 PATH은 다양한 프로그램 과 같은 것을 설정하고 복잡한 명령에 대한 합리적인 양의 스크립팅을 허용하므로 OpenSSH가 항상 사용 하기 때문에 사용하고 싶습니다 .
이것은 또한 몇 가지 보안 이점이 있습니다. 어떻게 든 유효한 암호를 가지고 있지만 /usr/sbin/nologin또는 셸이있는 시스템 계정에 로그인하려고 /bin/false하면 시스템 관리자가 의도 한 것과 같은 작업을 수행 할 수 없습니다.
이를 완화하는 방법이 있습니다. 많은 사람들이 도트 파일의 Git 저장소를 유지하고 한 시스템에서 개발 한 다음 다른 시스템에 배포합니다. 예를 들어, 저는 항상 노트북에서 dotfile 개발을합니다. 아마도 새 터미널 창을 열 때마다 즉시 종료되면이 문제를 조금 더 빨리 알아 차릴 수 있으며 직접 해결할 수있는 루트 액세스 권한이있을 수 있습니다.
셸 구성이나 sudoers변경 과 같이 사용자를 잠글 수있는 구성을 테스트해야하는 경우 하나의 셸 (각각 일반 또는 루트)을 열어 둔 다음 몇 가지 테스트를 수행 할 수 있습니다. 실행 취소하는 방법입니다.