Debian SSH - Yeniden boyutlandırma terminali bash ile kayıtlı değil


11

Disk arızası nedeniyle sunucumuzu yakın zamanda yeniden yükledik ve şimdi terminalleri yeniden boyutlandırmayla ilgili bir sorun yaşıyoruz. Debian 6.0.6'yı kurduk.

belirtiler

Bir terminali yeniden boyutlandırdığınızda, ncurses tabanlı hiçbir uygulama (test edildi: ytalk, irssi, screen, tmux, ncurses örnek uygulamalarından bazıları) doğru şekilde yeniden boyutlandırılmıyor gibi görünüyor. Ekran tipik olarak boş olur. Uygulamada yeniden çizmeye zorlamak, eski terminal boyutunu kullanarak yeniden çizilir.

Pencereyi bash (4.1.5 (1)) isteminde yeniden boyutlandırırken, COLUMNS ve LINES değişkenleri hiçbir zaman güncellenmez.

Teşhis

SIGWINCH'i bash içinde tuzağa düşürmeye çalışırken, hiç alınmamış gibi görünüyor. Bu aşağıdakilerle test edildi:

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

Her iki dosyayı da ana dizinimde oluşturmuş olmalıydım. Sadece yarattı /home/user/sigusr1.

kill -s SIGWINCH $$Bunu yapmaya çalışmak $ COLUMNS / $ LINES değişkenlerinin güncellenmesine neden olmaz.

checkwinsize( shopt -s checkwinsize) Etkinleştirildiğinde bash, herhangi bir uygulamadan (beklendiği gibi) döndüğünde $ COLUMNS / $ LINES'in güncellenmesine neden olur. Bu, checkwinsizeetkinleştirilmiş bir terminali yeniden boyutlandırdıktan sonra aşağıdakilere yol açar :

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

Giriş kabuğumu tcsh gibi bir şeye değiştirmek ve terminali beklediğim gibi yeniden boyutlandırmaya çalışmak, test ettiğim diğer kutulara da basıyor.

Benim .bashrc kaldırmayı denedim ve hiçbir şey yapmadı. Bu sorun, hem PuTTY'de hem de bir çeşit rxvt tipi terminalde bir Linux kutusundan değişen bash konfigürasyonlarına sahip diğer birkaç kullanıcı için ortaya çıkmaktadır.

strace

Bash üzerinde strace koştum ve terminali yeniden boyutlandırmaya çalıştım, hiçbir şey olmadı ( readistemi yazdırdıktan hemen sonra bir çağrıda engellenmiş kaldı ).

Boş bir çizgide geri döndüm ve bash bir sürü şey yaptı. Alakalı olduğuna inandığım çıktı: ( tam 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,

Bu da benim anlayışım için bash'ı gösteriyor: (Bunu korkunç bir şekilde yanlış anlayabilirdim. Buradaki unsurumdan çok uzaktayım.)

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.

Aynı sorun, bu sorunları olmayan bir kutuda (Ubuntu, bash 4.2.24 (1)) gerçekleştirildi:

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,

Soru

Cehennemde neler oluyor ve neden bashım kırık? :(

Sanırım muhtemelen bir yerlerde beklenmedik bir şeyle sonuçlanan bir seçenek var, ancak Google'daki saatler hiçbir şey göstermedi.

Herhangi bir yardım ve / veya işaretçiler büyük beğeni topluyor. Bu gerçekten sinir bozucu.

Teşekkür ederim.


İlk kişi siz değilsiniz: lists.gnu.org/archive/html/bug-bash/2007-01/msg00084.html Eğer exec bashelinizdeyse (artık bir giriş kabuğu değil) hala yanlış davranıyor mu? Değilse, ne olacak exec bash -l(yani bir giriş kabuğu)? Eğer öyleyse, o zaman oturum açma komut dosyalarınızla ilgili bir şey var ( /etc/profile /etc/profile.d/ ~/.bash_profile ~/.profile), ama ne aradığını söyleyeceğimi bile bilmiyorum SIGWINCH.
DerfK

Hem exec bashve exec bash -laynı davranışı sergiler. Sanırım bu konuda yalnız olmadığım küçük bir teselli. Yine de buna neyin sebep olacağı konusunda kafam karıştı. Colo, yeni indirilen bir Debian görüntüsünden minimal bir kurulum yükledi. Yerel olarak yüklemeyi denemek ve herhangi bir sorun olup olmadığını görmek zorundayım ve (başkaları için böyle görünmediğinden, hiçbiri varsayarak), çalışan sistemle karşılaştırmaya başlayın.
NuclearDog

Bir VM'de yeni bir kurulum yaptım, / etc ve / usr içindeki tüm dosyaların md5 toplamlarının bir listesini oluşturdum ve kırık sistemle karşılaştırıldım. Hızlı bir bakışta, yanlış bir şey göremiyorum. /etc/bash.bashrcve tüm /etc/profileve /etc/profile.ddosyaları yüklemek temiz değiştirilmemiştir. Ben bash kaynağı ( apt-get source bash) ./configureindirdim ve ben kaynağa kazmadan önce sorunu daraltmak için denemek ve daraltmak için çeşitli argümanlar ile oynuyorum .
NuclearDog

Bash eksi ile tüm Debian yamaları derledim --disable-readline --enable-minimal-config --disable-job-control, hangi dosyaların olduğunu görmek için bir strace koştum open, tüm bu dosyaları yeniden adlandırdım ve sonra tekrar giriş yaptım . Aynı sorun. Ben bash kendisi ile herhangi bir yapılandırma değişiklikleri kesinlikle reddetti.
NuclearDog

Aynı sorunu doğrudan GNU'dan alınan kaynaklardan derlenen bash 3.2, 4.1 ve 4.2 ile de çoğalttım. 4.2 iş denetimi olmadan ve bazı hatalar (bash ekibine bildirilen) nedeniyle minimum yapılandırma ile derleyemedim. Bu, bash'ın birkaç sürümünde gerçekleştiği göz önüne alındığında, hatanın bağlı olduğu kütüphanelerden biriyle ilgili olabileceğine inanmaya başlıyorum. Buna geçiyorum.
NuclearDog

Yanıtlar:


11

Strace çıkışı hakkında bir şeyler beni rahatsız ediyordu. Yani bash başladığında zaten SIGWINCH'nin maskelenmiş gibi görünüyordu. Emin olamazdı, tükürdüğünün yarısını anlamadı, ama kesinlikle bu noktada biraz araştırmaya değerdi.

strace -o strace_file bash -lSorunun olmadığı bir tcsh kabuğundan kaçtım . bash asla SIGWINCH'i maskelemedi. Maskeleme sırasında, sadece önceki maskeyi geri yüklemeye çalıştığı içindi. Peki ilk maske nereden geliyordu?

Google ve taze bir zihin ve I Biraz daha zaman buldum bu yazıyı SIGWINCH maskeli ile sshd başlatılmasına neden olabilir bazen bu yetenek söz ve ardından doğruca kabuk tüm olurken süreçler tarafından miras olacağını.

Denedim ps axwwws(hepsi, müstakil, geniş çıktı, sinyaller). Ortaya çıkan sshd işlemlerinin birkaçının SIGWINCH maskeli olduğunu gösterdi.

Sunucu / dinleme işlemi (sshd kendisi) olmadı. Ayrıca tcsh kullanılan bağlantıları barındıran süreçler de yapmadı. Bu kısım benim için kafa karıştırıcı. Sinyal maskesinin işlem grubu genişliğinde veya başka bir şey olduğunu (yine, bunlardan herhangi birini çok az bilmek) tahmin ediyorum, tcsh başlangıçta sıfırlıyor ve bu da ssh'ı etkiliyordu.

Yani, bir hevesle, tcsh ile bağlandım (SIGWINCH maskesi olmadan temiz bir terim elde etmek için), ssh'yi yeniden başlattım, kabuğumu bash olarak değiştirdim ... Ve işe yaradı! Her şey normale döndü!

Bildiğim kadarıyla bu kutuda yetenek çalıştırılmadı ve yapılandırma değişiklikleri için ssh birkaç kez yeniden başlatıldı. Çizgi boyunca bir yerde maske içeri girdi ve her şeyi kötü bir hastalık gibi enfekte etti.

Aynı sorunu tanımak için ps axwwws | grep sshd, ikinci uzun sütun ( BLOCKED) 0x8000000 ayarlanmış olarak sshd işlemlerini çalıştırın ve arayın . Bu SIGWINCH. Gibi bir şey:

   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

Düzeltmek için (muhtemelen en iyi çözüm değil, benim için çalıştı):

$ 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

Ve düzeltildi.

Şerefe!


1

Bunu dene. Yapmak

bash$ shopt -s checkwinsize

ardından terminal pencerenizi yeniden boyutlandırın.


2
ServerFault'a hoş geldiniz. Kullanıcının bu sorunu yıllar önce çözdüğünü fark ettiniz mi?
civcivler

1
Bana bash yerine tcsh kullanarak bir çözüm gibi görünüyordu.
gjvc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.