/etc/profile.d의 스크립트가 종료 상태 1로 종료되었기 때문에 서버에 SSH로 연결할 수 없습니다. [닫힘]

/etc/profile.d의 스크립트가 종료 상태 1로 종료되었기 때문에 서버에 SSH로 연결할 수 없습니다. [닫힘]

그래서 이 문제가 발생했습니다. SSH를 사용하여 서버에 로그인할 수 없습니다. 바라보다:

ssh -v myuser@myserver
debug1: Authentication succeeded (password).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
Last login: Sun Jul  5 20:10:54 2015 from x.x.x.x
-bash: KSH_VERSION: unbound variable
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype [email protected] reply 0
debug1: channel 0: free: client-session, nchannels 1
Connection to x.x.x.x closed.
Transferred: sent 2264, received 2800 bytes, in 0.2 seconds
Bytes per second: sent 13241.8, received 16376.8
debug1: Exit status 1

문제는 "-bash: KSH_VERSION: unbound 변수"로 인해 연결이 끊어지는 것 같습니다. 왜 이런 일이 일어나는지 압니다... 저는 /etc/profile.d에 넣는 스크립트를 작성하고 있는데 그 스크립트에는 "set -euo Pipelinefail"이 있습니다(죄송합니다)... "o" 옵션은 " nounset" 그리고 이것은 "바인딩되지 않은 변수"를 설명합니다... 스크립트가 옵션을 설정하면 바인딩되지 않은 변수에서 vim.sh가 실패하게 됩니다.

이제 이 문제를 어떻게 해결해야 할까요? SSH를 통해 파일 삭제 명령을 보낼 수 없습니다. 예를 들어 다른 사용자로 로그인할 수 없고, 다른 쉘을 사용할 수 없으며, "--noprofile" 및 "--norc" 옵션 bash가 작동하지 않습니다. ... 내가 시도한 것 어떤 트릭도 작동하지 않습니다 ...

어떤 아이디어가 있나요?

답변1

저도 같은 문제가 있었는데 마침내 해결책을 찾았습니다.

@nkms가 언급했듯이:

/etc/profile을 가져오기 전에 로그인 프로세스를 중단(Ctrl+C)할 확률은 약 1/3(적어도 저는 1/3)입니다.

확률을 높이기 위해 다음 루프를 사용했습니다.

$ (trap '' INT; while true; do ssh myuser@myserver; done)

스크립트는 하위 쉘 '('을 시작하고 해당 하위 쉘에 대한 ctr-c 명령을 비활성화합니다(trap 명령 사용). 그런 다음 ssh 명령을 반복합니다. ctrl-c를 계속 누르거나 ctrl-c를 누르고 있으면 가능성이 증가합니다. 적절한 순간을 포착하는 것.

... 기적적으로 작동합니다!

답변2

/etc/profile을 가져오기 전에 로그인 프로세스를 중단(Ctrl+C)할 확률은 약 1/3(적어도 저는 1/3)입니다.

$ ssh -v localhost
OpenSSH_6.6.1, OpenSSL 1.0.1e-fips 11 Feb 2013
........
Authenticated to localhost ([::1]:22).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
Last login: Tue Jul  7 19:46:42 2015 from localhost
^C-bash-4.2$ 

몇 가지 사항을 명확히 하기 위해 편집되었습니다.

sshd가 서버에서 세션을 열 때 사용자의 셸(이 경우 /bin/bash)을 읽어서 그렇게 합니다.

bash 또는 ssh 명령(sftp 포함)을 실행할 때 제공되는 옵션은 중요하지 않습니다. ssh 명령(sftp 포함) 또는 bash 옵션이 bash 인스턴스에 전달됩니다.뒤쪽에세션이 열려 있습니다. 이 인스턴스의 동작을 제어할 수 없습니다. 예를 들어:

client$ ssh localhost bash --noprofile --norc

서버의 strace 출력:

[pid 60047] execve("/bin/bash", ["bash", "-c", "bash --noprofile --norc"], [/* 16 vars */]) = 0
[pid 60047] execve("/usr/bin/bash", ["bash", "--noprofile", "--norc"], [/* 28 vars */]) = 0

보시다시피, ssh 명령("bash --noprofile --norc")은 첫 번째 execve에서 "-c" 옵션을 사용하여 "bash"에 인수로 전달됩니다.

제어할 수 없는 bash의 첫 번째 인스턴스는 ~/.bashrc입니다. 그러면 /etc/bashrc가 읽혀지고 /etc/profile.d/ 아래에 스크립트가 로드됩니다(적어도 Red Hat 시스템에서는 그렇지 않습니다. 이) 다른 사람에 대해 모른다).

[pid 60047] open("/home/user/.bashrc", O_RDONLY) = 3
[pid 60047] open("/etc/bashrc", O_RDONLY) = 3

내가 생각할 수 있는 유일한 방법은 스크립트를 로드하기 전에 로그인 프로세스를 중단할 만큼 빠르지만 세션을 중단할 만큼 빠르지는 않습니다. - 로그인 프로세스 동안 더 많은 시간을 제공하기 위해 시스템 로드를 늘릴 수도 있습니다(가능한 경우).

추신: 답변이 유용하다고 생각되면 표시해 주세요.

답변3

실패 했나요 sftp? 그렇지 않은 경우 이것을 사용하여 하나를 배치할 수 있습니다.좋아요 /etc/profile.d 파일이 거기에 있습니다.

답변4

이것은 작동하지 않을 것 같지만 SSH 연결을 설정할 때 KSH_VERSION 값을 보내 볼 수 있습니다.

KSH_VERSION=x ssh -v -o 'SendEnv=KSH_VERSION' myuser@myserver

아이디어는 환경 변수를 특정 값으로 설정하여 bash가 설정되지 않았다고 불평하지 않도록 하는 것입니다. 기본 SSH 서버 구성에서는 이 특정 변수를 설정할 수 없기 때문에 작동하지 않을 것 같습니다. 이는 누군가가 이 특정 서버에서 설정을 더 허용하도록 만들 이유가 있는 경우에만 작동합니다.

관련 정보