데비안 SSH-크기 조정 터미널이 bash에 등록되지 않습니다


11

최근 디스크 오류로 인해 서버를 다시 설치했으며 이제 터미널 크기 조정에 문제가 있습니다. 데비안 6.0.6을 설치했습니다.

조짐

터미널 크기를 조정할 때 ncurses 기반 앱 (테스트 : ytalk, irssi, screen, tmux, 일부 ncurses 예제 응용 프로그램)이 올바르게 크기 조정되지 않는 것 같습니다. 일반적으로 화면이 나타나지 않습니다. 응용 프로그램에서 다시 그리기를 수행하면 이전 터미널 크기를 사용하여 다시 그리기가 수행됩니다.

bash (4.1.5 (1)) 프롬프트에서 창의 크기를 조정할 때 COLUMNS 및 LINES 변수는 업데이트되지 않습니다.

진단

bash에서 SIGWINCH를 잡으려고 시도하면 결코 수신되지 않는 것 같습니다. 이것은 다음과 같이 테스트되었습니다.

trap 'touch /home/user/sigwinch' SIGWINCH
trap 'touch /home/user/sigusr1' SIGUSR1
kill -s SIGWINCH $$
kill -s SIGUSR1 $$

내 홈 디렉토리에 두 파일을 모두 생성해야합니다. 만 만들었습니다 /home/user/sigusr1.

시도해도 kill -s SIGWINCH $$$ COLUMNS / $ LINES 변수가 업데이트되지 않습니다.

checkwinsize( shopt -s checkwinsize)를 활성화 하면 bash가 응용 프로그램에서 반환 될 때 예상대로 $ COLUMNS / $ LINES를 업데이트합니다. checkwinsize활성화 된 터미널의 크기를 조정 한 후 다음과 같은 결과가 나타납니다 .

$ echo $COLUMNS ; ls > /dev/null ; echo $COLUMNS
72
107

로그인 쉘을 tcsh와 같은 것으로 변경하고 터미널 크기를 조정하려고 시도하면 테스트 한 다른 상자의 bash와 마찬가지로 예상대로 작동합니다.

.bashrc를 제거하려고 시도했지만 아무것도하지 않았습니다. 이 문제는 PuTTY 및 Linux 상자의 일종의 rxvt 유형 터미널 모두에서 다양한 bash 구성을 가진 다른 여러 사용자에게 발생합니다.

strace

나는 bash에서 strace를 실행하고 터미널 크기 조정을 시도했지만 아무것도 통과하지 못했습니다 ( read프롬프트를 인쇄 한 직후 호출에서 차단 된 상태로 유지 됨 ).

나는 빈 줄에 돌아 왔고 bash는 많은 일을했습니다. 내가 관련 있다고 생각하는 출력은 다음과 같습니다 (( strace )

1: rt_sigprocmask(SIG_SETMASK, [WINCH], NULL, 8) = 0
2: rt_sigaction(SIGWINCH, {0x80e2c20, [], SA_RESTART}, {0x809c310, [], 0}, 8) = 0
3: rt_sigprocmask(SIG_BLOCK, [INT], [WINCH], 8) = 0
4: write(2, "aa:~$ ", 6)                   = 6
5: rt_sigprocmask(SIG_SETMASK, [WINCH], NULL, 8) = 0
6: rt_sigprocmask(SIG_BLOCK, NULL, [WINCH], 8) = 0
7: read(0,

bash는 내 이해를 보여줍니다. (이것은 끔찍하게 오해 할 수 있습니다. 나는 여기에서 내 요소를 벗어났습니다.)

1: Disabling delivery of the SIGWINCH signal, when previously it was allowed.
2: Registering a handler for the SIGWINCH signal.
3: Masking some other combination of signals. As evidenced by line 5, this does not include SIGWINCH.
4: Printing the prompt.
5: Masking SIGWINCH, where previously nothing was blocked.
6: Masking the "union of null and SIGWINCH" which, to my understanding, would result in SIGWINCH being masked.
7: Waiting on input.

이러한 문제없이 상자에서 수행 된 동일한 strace (Ubuntu, bash 4.2.24 (1))는 다음을 초래했습니다.

1: rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
2: rt_sigaction(SIGWINCH, {0x49e320, [], SA_RESTORER|SA_RESTART, 0x7f7ef49f64c0}, {0x457880, [], SA_RESTORER, 0x7f7ef49f64c0}, 8) = 0
3: rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
4: write(2, "aaaaaaa:~$ ", 11)             = 11
5: rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
6: rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
7: read(0,

질문

도대체 무슨 일이 일어나고 왜 내 배쉬가 깨졌습니까? :(

어딘가에 예상치 못한 옵션이있을 수 있지만 Google의 몇 시간 동안 아무것도 켜지지 않았습니다.

어떤 도움이나 조언을 주시면 감사하겠습니다. 정말 실망 스럽습니다.

감사합니다.


당신은 첫 번째가 아닙니다 : lists.gnu.org/archive/html/bug-bash/2007-01/msg00084.html 당신 exec bash이 손으로 (그래서 더 이상 로그인 쉘이 아님) 여전히 오작동합니까? 그렇지 않은 경우는 exec bash -l어떻습니까 (그래서 로그인 쉘)? 그렇다면 로그인 스크립트 ( /etc/profile /etc/profile.d/ ~/.bash_profile ~/.profile)에 문제가 있지만 쉘에하지 말아야 할 것을 알 수있는 것을 알지 못합니다 SIGWINCH.
DerfK

모두 exec bashexec bash -l같은 동작을 나타낸다. 나는 이것이 혼자가 아니라 작은 위안이라고 생각합니다. 그러나이 원인에 대해서는 혼란 스럽습니다. 콜로는 새로 다운로드 한 데비안 이미지에서 최소 설치를 설치했습니다. 로컬로 설치를 시도하고 문제가 있는지 확인하고 (다른 사람에게는 발생하지 않는 것으로 가정하므로) 실행중인 시스템과 비교를 시작하십시오.
NuclearDog

VM에서 새로 설치하고 / etc 및 / usr에있는 모든 파일의 md5 합계 목록을 생성하고 손상된 시스템과 비교했습니다. 언뜻보기에는 분명히 잘못된 것을 볼 수 없습니다. 새로 설치 한 /etc/bash.bashrc모든 파일 /etc/profile/etc/profile.d파일은 변경되지 않았습니다. bash 소스 ( apt-get source bash)를 다운로드했으며 소스를 ./configure파기 전에 문제를 좁히기 위해 다양한 주장을 하고 있습니다.
NuclearDog

나는 bash에서 모든 데비안 패치를 빼고 컴파일 --disable-readline --enable-minimal-config --disable-job-control하고 strace를 실행하여 어떤 파일인지 확인하고 open모든 파일의 이름을 바꾼 다음 다시 로그인했습니다. 같은 문제입니다. 나는 bash 자체를 사용하여 구성 변경을 거의 배제했습니다.
NuclearDog

GNU에서 직접 검색 한 소스에서 컴파일 된 bash 3.2, 4.1 및 4.2와 동일한 문제를 복제했습니다. 작업 제어가없고 일부 버그 (bash 팀에보고)로 인해 최소 구성으로 4.2를 컴파일 할 수 없었습니다. 이것이 여러 버전의 bash에서 발생한다는 것을 감안할 때 오류가 의존하는 라이브러리 중 하나에 오류가 있다고 생각하기 시작했습니다. 그로 넘어갑니다.
NuclearDog

답변:


11

strace 출력에 대해 무언가 나를 괴롭 혔습니다. 즉, bash가 시작되었을 때 이미 SIGWINCH가 마스크 된 것처럼 보였습니다. 확실하지 않았으며, 뱉어 낸 것의 절반을 이해하지 못했지만이 시점에서 약간의 탐험 가치가 있습니다.

strace -o strace_file bash -l문제가 존재하지 않는 tcsh 쉘에서 실행 했습니다. bash는 SIGWINCH를 마스크하지 않았습니다. 마스킹 할 때 이전 마스크를 복원하려고했기 때문입니다. 초기 마스크는 어디에서 왔습니까?

구글에 대한 더 많은 시간과 상쾌한 마음 을 가지고이 에서 적성이 때때로 sshd가 SIGWINCH 마스크로 시작될 수 있으며, 그 후 생성 된 모든 프로세스에 의해 쉘로 바로 상속 될 것이라고 언급했습니다.

나는 ps axwwws(모두 분리, 넓은 출력, 신호)를 시도했다 . 생성 된 sshd 프로세스 중 몇 가지에 SIGWINCH가 마스킹 된 것으로 나타났습니다.

서버 / 리스닝 프로세스 (sshd 자체)는 그렇지 않았습니다. 연결을 호스팅하는 프로세스도 tcsh를 사용하지 않았습니다. 그 부분은 나에게 혼란 스럽다. 신호 마스크가 프로세스 그룹 전체 또는 무언가이며 tcsh가 시작시 재설정하고 ssh에도 영향을 미쳤다고 추측합니다 (다시 말하지만, 이것에 대해 거의 알지 못합니다).

그래서 변덕스럽게도 tcsh (SIGWINCH 마스크가없는 깨끗한 용어를 얻기 위해)에 연결하고 ssh를 다시 시작하고 쉘을 다시 bash로 변경했습니다 ... 그리고 그것은 작동했습니다! 모든 것이 정상으로 돌아 왔습니다!

내가 아는 한이 상자에서 적성이 실행되지 않았으며 구성 변경을 위해 ssh가 몇 번 다시 시작되었습니다. 마스크를 따라 어딘가에 가면 나쁜 질병과 같은 모든 것을 감염 시켰습니다.

동일한 문제를 인식하려면 ps axwwws | grep sshd두 번째 긴 열 ( BLOCKED)이 0x8000000으로 설정된 sshd 프로세스를 실행하십시오 . SIGWINCH입니다. 다음과 같은 것 :

   0 26425 0000000000000000 0000000008000000 0000000000001000 0000000180004003 Ss   ?          0:00 sshd: aa [priv]
1000 26430 0000000000000000 0000000008000000 0000000000001000 0000000180010000 S    ?          0:02 sshd: aa@pts/24

그것을 고치려면 (아마도 최선의 해결책은 아닐 수도 있습니다.)

$ sudo apt-get install tcsh
[snip]
$ chsh -s /bin/tcsh
[connect in with a new connection, leave the old one open in case of any issues with tcsh]
$ sudo /etc/init.d/ssh restart

그리고 그것은 고정되었습니다.

건배!


1

이 시도. 하다

bash$ shopt -s checkwinsize

쉘에서 터미널 창의 크기를 조정하십시오.


2
ServerFault에 오신 것을 환영합니다. 사용자가 몇 년 전에이 문제를 이미 해결했음을 알고 있습니까?
병아리

1
bash 대신 tcsh를 사용하여 해결 방법처럼 보였습니다.
gjvc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.