EC2 서버에 SSH로 연결할 때 무한 bash 루프(bashrc + bash_profile)를 수정하는 방법은 무엇입니까?

EC2 서버에 SSH로 연결할 때 무한 bash 루프(bashrc + bash_profile)를 수정하는 방법은 무엇입니까?

실수로 파일에 소스 코드를 포함시켰고 그 반대의 경우도 마찬가지였습니다 .bash_profile. bashrc이제 머신(ec2)에 ssh를 시도하면 bash 로딩이 중단되고 1초 내에 연결이 닫힙니다. 고칠 수 있는 방법이 있나요? bash 파일을 수정하기 위해 디스크를 다른 ec2 인스턴스에 탑재할 수 있습니까?


업데이트 1: 다음을 시도했습니다.

%  ssh -i "my-pem.pem" -t ubuntu@<server_address>.amazonaws.com "/bin/bash --noprofile --norc"
Connection to <server_address>.amazonaws.com closed.

다른 것은 나타나지 않습니다. 무엇이 문제인지 아시나요?

온전한 확인을 위해 이렇게 하면 ssh -i "my-pem.pem"ubuntu@<server_address>.amazonaws.com메시지는 다음과 같습니다.

...

28 packages can be updated.
0 of these updates are security updates.
To see these additional updates run: apt list --upgradable

New release '20.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Mon Feb 22 23:17:41 2021 from ip
Connection to <server_address>.amazonaws.com closed.

해결책

머신에 SSH를 통해 연결하고 Ctrlc즉시 bash 파일을 수정하세요.

답변1

[고쳐 쓰다]

이 흥미로운 사례는 더 나은 답변을 받을 자격이 있습니다.슈퍼유저에 대한 답변입니다.).

ssh user@server command아래의 원래 답변은 명령이 비대화형 쉘에서 실행되어야 오류가 .bashrc실행되는 것을 방지 한다는 사실에 의존했습니다 .

문제는 원격 쉘에 있습니다. Bash라면 다음 rc 파일을 실행할 수 있는 특별한 함수가 있습니다:

rshd(man bash) Bash는 원격 쉘 데몬(보통 ) 또는 보안 쉘 데몬 에 의해 실행될 때와 같이 네트워크 연결에 연결된 표준 입력을 사용하여 실행 중인지 확인하려고 시도합니다 sshd. bash가 이런 방식으로 실행 중이라고 판단하면 ~/.bashrc(파일이 존재하고 읽을 수 있는 경우) 명령을 읽고 실행합니다 . sh로 호출하면 이 작업이 수행되지 않습니다. 이 --norc옵션을 사용하면 이 동작을 억제할 수 있고 --rcfile다른 파일을 강제로 읽으려면 이 옵션을 사용할 수 있지만 일반적으로 쉘은 이러한 옵션 rshd으로 호출 sshd되거나 지정이 허용되지 않습니다.

즉, 원격 셸이 Bash인 경우 를 실행하더라도 ssh user@server 'rm .bashrc'명령이 .bashrc먼저 실행되고 끝없는 루프로 인해 rm명령이 실행되지 않습니다.

명령을 호출하여 내부적으로 실행 scp되므로 저장되지 않습니다 .sshdsh -c scp ...

유일한 예외는 SFTP입니다. sshd내장 SFTP 서버. sshd외부 서버 대신 이 내부 SFTP 서버를 사용하도록 구성된 경우 서버가 시작되지 않습니다 bash -c ....

scp따라서 원격 기본 셸 이 Bash인 경우 유일한 옵션은 sftp.


[원래 답변]

설치에 따라 다음과 같은 몇 가지 옵션이 있습니다.

파일 을 편집하세요 .bashrc:

ssh -t user@server 'vi ~/.bashrc'

bash파일 없이 실행 .bashrc:

ssh -t user@server '/bin/bash --noprofile --norc'

다른 셸을 실행합니다.

ssh -t user@server /bin/sh

( 는 예입니다. 또는 sh와 같이 서버에서 사용 가능한 다른 셸을 사용해 볼 수 있습니다 .)cshfish

다운로드-편집-업로드 문제가 있습니다 .bashrc:

$ scp user@server:~/.bashrc /tmp/bashrc
$ vi /tmp/bashrc
$ scp /tmp/bashrc user@server:~/.bashrc

답변2

를 실행하면 ssh기본적으로 대화형 모드에서 셸이 실행되고 대화형 모드에서 처리됩니다 .bashrc. 그러나 실행할 명령을 지정하면 비대화형 모드에서 셸이 호출됩니다(따라서 의 는 처리되지 않습니다 .bashrc). .

이를 사용하여 대화형 셸을 시작할 수 있지만 셸에 명령줄 인수를 지정하여 다음을 처리하지 않도록 지시할 수 있습니다 .bashrc.

$ ssh -t user@host "/bin/bash --noprofile --norc"
bash-5.0$

파일 에 문제가 있는 경우 .bashrc로그인하는 데 도움이 될 수 있습니다. 그러나 문제가 bash 관련 profile파일(예: .bash_profile)에 있는 경우 첫 번째 비대화형 셸에서 여전히 중단될 수 있습니다.

답변3

~/.bashrc일반적으로 대화 형 쉘과 로그인 쉘 (~/.bash_profile로그인 쉘과 비로그인 쉘의 차이점은 무엇입니까?). Ssh를 통해 명령만 보내면 대화형 셸이나 로그인 셸이 제공되지 않으므로 파일 중 하나의 이름을 바꾸면 됩니다(예:) ssh user@host 'mv .bashrc .bashrc.bak'.

그러나 Xhienne이 지적했듯이 한 가지 예외가 있습니다.SSH 데몬에 의해 호출되면 Bash는 Bashrc를 얻습니다..

하지만,Xhienne와 나는 이것을 재현할 수 없었습니다.. 내 테스트는 touch testfile서버의 Bashrc에 연결한 다음 더미 명령을 시도하여 무슨 일이 일어났는지 확인하는 것이었습니다 ssh Quasímodo@server 'echo x'. 결과: 아무것도 testfile생성되지 않았습니다. 나중에서야 내 Bashrc의 첫 번째 줄에 다음 내용이 포함되어 있다는 사실을 알게 되었습니다.

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

즉, 쉘이 대화형이 아닌 경우 Bashrc 읽기를 중지하십시오. 이 깔끔한 트릭은 실제로 다음과 같이 대부분의 배포판에 존재합니다. bashrc가 현재 쉘이 대화형인지 확인하는 이유는 무엇입니까?

결론적으로

Andy, Xhienne 및 내 원래 답변(SSH를 통해 명령을 실행하는 것과 동일)은

  • 사용자의 원격 Bashrc에 조각이 있으면 성공합니다.
  • 그렇지 않으면 실패할 것입니다. 이 경우 다음에서 몇 가지 옵션을 찾을 수 있습니다.서버 장애, 여기서 Ctrl-C.

관련 정보