Debian SSH - Größenänderungsterminal registriert sich nicht bei bash

11

Wir haben unseren Server kürzlich aufgrund eines Festplattenfehlers neu installiert und haben jetzt ein Problem mit der Größenänderung von Terminals. Wir haben Debian 6.0.6 installiert.

Symptome

Wenn Sie die Größe eines Terminals ändern, scheinen keine auf ncurses basierenden Apps (getestet: ytalk, irssi, screen, tmux, einige der ncurses-Beispielanwendungen) die Größe korrekt zu ändern. Der Bildschirm bleibt normalerweise leer. Wenn Sie ein erneutes Zeichnen in der Anwendung erzwingen, wird das Zeichnen mit der alten Terminalgröße neu erstellt.

Wenn Sie die Größe eines Fensters an einer Bash-Eingabeaufforderung (4.1.5 (1)) ändern, werden die Variablen COLUMNS und LINES niemals aktualisiert.

Diagnose

Beim Versuch, das SIGWINCH in Bash zu fangen, scheint es, dass es niemals empfangen wird. Dies wurde getestet mit:

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

Welches sollte beide Dateien in meinem Home-Verzeichnis erstellt haben. Es wurde nur erstellt /home/user/sigusr1.

Der Versuch, kill -s SIGWINCH $$dies zu tun , führt nicht zu einer Aktualisierung der Variablen $ COLUMNS / $ LINES.

Wenn Sie checkwinsize( shopt -s checkwinsize) aktivieren, aktualisiert bash $ COLUMNS / $ LINES bei Rückkehr von einer beliebigen Anwendung (wie erwartet). Dies führt nach dem Ändern der Größe eines Terminals mit checkwinsizeaktiviertem Status zu Folgendem :

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

Das Ändern meiner Login-Shell in etwas wie tcsh und der Versuch, die Größe des Terminals zu ändern, funktioniert wie erwartet, ebenso wie das Bash auf anderen von mir getesteten Boxen.

Ich habe versucht, meine .bashrc zu entfernen, aber es hat nichts getan. Dieses Problem tritt bei mehreren anderen Benutzern mit unterschiedlichen Bash-Konfigurationen sowohl in PuTTY als auch in einer Art Terminal vom Typ rxvt von einer Linux-Box auf.

strace

Ich habe strace on bash ausgeführt und versucht, die Größe des Terminals zu ändern. Es ist nichts durchgekommen (es blieb bei einem readAnruf unmittelbar nach dem Drucken der Eingabeaufforderung blockiert ).

Ich drückte auf einer leeren Zeile die Eingabetaste und Bash machte eine ganze Reihe von Sachen. Die Ausgabe, die ich für relevant halte, ist: ( volle 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,

Was nach meinem Verständnis Bash zeigt: (Ich könnte das schrecklich missverstehen. Ich bin hier weit aus meinem Element heraus.)

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.

Dieselbe Strace, die auf einer Box ohne diese Probleme durchgeführt wurde (Ubuntu, Bash 4.2.24 (1)), führte zu:

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,

Frage

Was zum Teufel ist los und warum ist meine Bash kaputt? :(

Ich vermute, es gibt wahrscheinlich nur eine Option, die standardmäßig etwas Unerwartetes enthält, aber Stunden bei Google haben nichts ergeben.

Jede Hilfe und / oder Hinweise werden sehr geschätzt. Das ist wirklich frustrierend.

Vielen Dank.

NuclearDog
quelle
Sie sind nicht der erste: lists.gnu.org/archive/html/bug-bash/2007-01/msg00084.html Wenn Sie exec bashvon Hand (es ist also keine Login-Shell mehr), verhält es sich dann immer noch schlecht? Wenn nicht, was ist mit exec bash -l(es ist also eine Login-Shell)? Wenn ja, dann stimmt etwas nicht mit Ihren Anmeldeskripten ( /etc/profile /etc/profile.d/ ~/.bash_profile ~/.profile), aber ich weiß nicht einmal, was ich Ihnen sagen soll, um danach zu suchen, was der Shell sagen kann, dass sie es nicht tun soll SIGWINCH.
DerfK
Beide exec bashund exec bash -lzeigen das gleiche Verhalten. Ich nehme an, es ist ein kleiner Trost, dass ich damit nicht allein bin. Ich bin jedoch völlig verwirrt darüber, was dies verursachen würde. Das colo installierte eine minimale Installation von einem frisch heruntergeladenen Debian-Image. Ich muss versuchen, lokal zu installieren, um festzustellen, ob es Probleme gibt, und (vorausgesetzt, keine, da dies bei anderen Personen nicht der Fall zu sein scheint) mit dem Vergleich mit dem laufenden System beginnen.
NuclearDog
Ich habe eine Neuinstallation in einer VM durchgeführt, eine Liste der MD5-Summen aller Dateien in / etc und / usr erstellt und mit dem defekten System verglichen. Auf einen kurzen Blick sehe ich nichts offensichtlich Falsches. /etc/bash.bashrcAlle /etc/profileund /etc/profile.d-Dateien bleiben bei einer Neuinstallation unverändert. Ich habe die Bash-Quelle ( apt-get source bash) heruntergeladen und spiele mit verschiedenen Argumenten ./configure, um das Problem einzugrenzen, bevor ich mich mit der Quelle befasse.
NuclearDog
Ich habe bash minus aller Debian-Patches mit kompiliert --disable-readline --enable-minimal-config --disable-job-control, eine Strace ausgeführt, um zu sehen, welche Dateien es sein würde open, alle diese Dateien umbenannt und mich dann erneut angemeldet. Gleicher Fehler. Ich habe Konfigurationsänderungen mit bash selbst ziemlich definitiv ausgeschlossen.
NuclearDog
Ich habe das gleiche Problem mit Bash 3.2, 4.1 und 4.2 repliziert, die aus Quellen kompiliert wurden, die direkt von GNU abgerufen wurden. Ich konnte 4.2 ohne Jobkontrolle und mit minimaler Konfiguration aufgrund einiger Fehler nicht kompilieren (dem Bash-Team gemeldet). Angesichts der Tatsache, dass dies bei mehreren Versionen von Bash auftritt, glaube ich, dass der Fehler bei einer der Bibliotheken liegt, von denen er abhängt. Fahren Sie damit fort.
NuclearDog

Antworten:

11

Etwas hatte mich an der Strace-Ausgabe gestört. Es schien nämlich, dass zu Beginn der Bash SIGWINCH bereits maskiert war. Konnte nicht sicher sein, verstand nicht die Hälfte von dem, was es ausspuckte, aber es war an dieser Stelle sicherlich eine Erkundung wert.

Ich lief strace -o strace_file bash -lvon einer tcsh-Shell, in der das Problem nicht vorhanden war. Bash hat SIGWINCH nie maskiert. Beim Maskieren wurde nur versucht, die vorherige Maske wiederherzustellen. Woher kam also die ursprüngliche Maske?

Noch etwas Zeit bei Google und ein frischer Verstand und ich fanden diesen Beitrag, in dem erwähnt wurde, dass Eignung manchmal dazu führen kann, dass sshd mit maskierter SIGWINCH gestartet wird, und dass es dann von allen erzeugten Prozessen direkt bis zur Shell vererbt wird.

Ich habe es versucht ps axwwws(alle, freistehende, breite Ausgabe, Signale). Es zeigte, dass mehrere der erzeugten sshd-Prozesse SIGWINCH maskiert hatten.

Der Server / Listening-Prozess (sshd selbst) hat dies nicht getan. Auch die Prozesse, die Verbindungen hosten, die tcsh verwenden, haben dies nicht getan. Dieser Teil ist für mich verwirrend. Ich vermute (wieder sehr wenig darüber wissend), dass die Signalmaske prozessgruppenweit ist oder so, tcsh hat sie beim Start zurückgesetzt, und das hat auch ssh beeinflusst.

Aus einer Laune heraus habe ich mich mit tcsh verbunden (um einen sauberen Begriff ohne SIGWINCH-Maske zu erhalten), ssh neu gestartet und meine Shell wieder auf bash geändert ... Und es hat funktioniert! Alles ist wieder normal!

Soweit ich weiß, wurde aptitude auf dieser Box nicht ausgeführt, und ssh wurde einige Male wegen Konfigurationsänderungen neu gestartet. Irgendwann drang die Maske ein und infizierte alles wie eine schlimme Krankheit.

Um dasselbe Problem zu erkennen, führen Sie ps axwwws | grep sshdsshd aus und suchen Sie nach sshd-Prozessen, für die in der zweiten langen Spalte ( BLOCKED) 0x8000000 festgelegt ist. Das ist SIGWINCH. Etwas wie:

   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

Um das Problem zu beheben (möglicherweise nicht die beste Lösung, hat bei mir funktioniert):

$ 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

Und es ist behoben.

Prost!

NuclearDog
quelle
1

Versuche dies. Tun

bash$ shopt -s checkwinsize

Ändern Sie in Ihrer Shell die Größe Ihres Terminalfensters.

gjvc
quelle
2
Willkommen bei ServerFault. Haben Sie bemerkt, dass der Benutzer dieses Problem bereits vor Jahren gelöst hat?
Küken
1
Es sah für mich wie eine Problemumgehung aus, tcsh anstelle von bash zu verwenden.
GJVC