실수로 파일에 소스 코드를 포함시켰고 그 반대의 경우도 마찬가지였습니다 .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
되므로 저장되지 않습니다 .sshd
sh -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
와 같이 서버에서 사용 가능한 다른 셸을 사용해 볼 수 있습니다 .)csh
fish
다운로드-편집-업로드 문제가 있습니다 .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.