Debian SSH - термінал розміру не реєструється bash


11

Нещодавно ми перевстановили наш сервер через збій диска, і тепер у нас виникає проблема із зміною терміналів. Ми встановили Debian 6.0.6.

Симптоми

Коли ви змінюєте розмір терміналу, жодна програма на основі ncurses (перевірена: ytalk, irssi, екран, tmux, деякі з прикладних програм ncurses), здається, не змінить розмір правильно. Екран зазвичай закінчується порожнім. Примусовий перемальовування програми буде перемальовано за допомогою старого розміру терміналу.

Змінюючи розмір вікна у запиті bash (4.1.5 (1)), змінні COLUMNS та LINES ніколи не оновлюються.

Діагностика

Спроба захопити SIGWINCH в bash, здається, його ніколи не отримують. Це було протестовано за допомогою:

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) призведе до того, що баш оновить $ COLUMNS / $ LINES після повернення з будь-якої програми (як очікувалося). Це призводить до наступного після зміни розміру терміналу з checkwinsizeувімкненим:

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

Зміна моєї вхідної оболонки на щось на кшталт tcsh та спроба змінити розмір терміналу працює, як очікувалося, як і башти в інших тестованих ящиках.

Я спробував видалити свій .bashrc, і це нічого не зробило. Ця проблема виникає для декількох інших користувачів із різними конфігураціями bash як у PuTTY, так і в якомусь терміналі типу rxvt з поля Linux.

стрижка

Я натрапив на баш і спробував змінити розмір терміналу, нічого не вийшло (він залишився заблокованим під час readвиклику одразу після друку підказки).

Я повернувся на порожній рядок, і Баш зробив цілу купу речей. Результат, який я вважаю релевантним, такий: ( повна штрих )

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,

Що свідчить про грубість, наскільки я розумію: (Я можу жахливо нерозуміти це. Я виходжу зі свого стилю тут.)

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.

Це ж штрих, виконаний на коробці без цих проблем (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 нічого не виявили.

Будь-яка допомога та / або вказівки високо оцінені. Це справді засмучує.

Дякую.


Ви не перший: list.gnu.org/archive/html/bug-bash/2007-01/msg00084.html Якщо ви exec bashвручну (значить, це вже не оболонка для входу), вона все ще не поводиться? Якщо ні, то що з цим exec bash -l(значить, це оболонка для входу)? Якщо так, то щось із вашими скриптами для входу в систему ( /etc/profile /etc/profile.d/ ~/.bash_profile ~/.profile), але я навіть не знаю, що сказати вам, щоб шукати, що може сказати оболонці не робити SIGWINCH.
ДерфК

І те, exec bashі exec bash -lінше проявляють однакову поведінку. Я гадаю, це невелика розрада, що я не один у цьому. Я все-таки ретельно розгублений щодо того, що могло б викликати це. Колор встановив мінімальну установку із щойно завантаженого зображення Debian. Мені доведеться спробувати встановити локально і побачити, чи є якісь проблеми, і (якщо таких немає, оскільки це, здається, не трапляється для інших людей), почніть порівнювати з працюючою системою.
NuclearDog

Я зробив нову інсталяцію у віртуальній машині, генерував список md5 сум усіх файлів у / etc та / usr та порівнював із зламаною системою. Швидким поглядом я не бачу нічого очевидно неправильного. /etc/bash.bashrcі всі файли /etc/profileта /etc/profile.dфайли не змінюються після чистої установки. Я завантажив джерело bash ( apt-get source bash) і граю з різними аргументами, ./configureщоб спробувати усунути проблему, перш ніж викопати джерело.
NuclearDog

Я склав bash мінус усі патчі Debian --disable-readline --enable-minimal-config --disable-job-control, провів строку, щоб побачити, які файли це openперейменовано, перейменував усі ці файли, а потім знову увійшов у систему. Те саме питання. Я досить точно виключав будь-які зміни конфігурації з самим bash.
NuclearDog

Я повторив ту саму проблему з bash 3.2, 4.1 та 4.2, зібраними з джерел, отриманих безпосередньо з GNU. Мені не вдалося скласти 4.2 без контролю за роботою та з мінімальним конфігурацією через деякі помилки (повідомлено команді bash). З огляду на те, що це відбувається з декількома версіями bash, я починаю вважати, що помилка може лежати в одній з бібліотек, від якої вона залежить. Переходимо до цього.
NuclearDog

Відповіді:


11

Щось клопотало мене про вихід страйку. А саме, здавалося, що коли почався баш, здавалося, що він вже маскується SIGWINCH. Не міг бути впевнений, не зрозумів і половини того, що він виплюнув, але, безумовно, варто було трохи вивчити цей момент.

Я біг strace -o strace_file bash -lіз оболонки tcsh, де питання не було. Баш ніколи не маскувався SIGWINCH. Коли він маскував її, це було лише тому, що вона намагалася відновити попередню маску. То звідки взялася початкова маска?

Ще деякий час в Google і свіжий розум, і я знайшов цю публікацію, в якій згадувалося, що здатність іноді може спричинити запуск sshd з маскуванням SIGWINCH, і що він буде успадкований усіма породженими процесами прямо до оболонки.

Я спробував ps axwwws(усі, відокремлені, широкий вихід, сигнали). Це показало, що кілька породжених sshd-процесів були замасковані SIGWINCH.

Процес сервера / прослуховування (сам sshd) цього не робив. Також не відбувалися процеси, що розміщували з'єднання, які використовували tcsh. Ця частина мене бентежить. Я здогадуюсь (знову ж таки, знаючи дуже мало про що-небудь із цього), що сигнальна маска є широкою групою процесів або щось подібне, tcsh скидає її на початку, і це впливає також на ssh.

Отже, за примхою, я з'єднався з tcsh (щоб отримати чистий термін без маски SIGWINCH), перезапустив ssh, змінив оболонку назад на bash ... І це спрацювало! Все повернулося до норми!

Наскільки я знаю, у цьому вікні не було запущено можливості, і ssh було перезапущено кілька разів для зміни конфігурації. Десь уздовж лінії маска пробилася, хоча і заразила все, як погана хвороба.

Щоб розпізнати ту саму проблему, запустіть ps axwwws | grep sshdі шукайте sshd-процеси з другим довгим стовпцем ( BLOCKED) має набір 0x8000000. Ось ЗІГВІНЧ. Щось на зразок:

   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
Мені виглядало як вирішення для мене використання tcsh замість bash.
gjvc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.