Debian SSH - Mengubah ukuran terminal tidak mendaftar dengan bash

11

Kami baru-baru ini menginstal ulang server kami karena kegagalan disk, dan sekarang kami mengalami masalah dengan pengubahan ukuran terminal. Kami menginstal Debian 6.0.6.

Gejala

Ketika Anda mengubah ukuran terminal, tidak ada aplikasi berbasis ncurses (diuji: ytalk, irssi, layar, tmux, beberapa aplikasi contoh ncurses) tampaknya mengubah ukuran dengan benar. Layar biasanya kosong. Memaksa redraw dalam aplikasi akan redraw menggunakan ukuran terminal lama.

Saat mengubah ukuran jendela pada prompt bash (4.1.5 (1)), variabel COLUMNS dan LINES tidak pernah diperbarui.

Diagnostik

Mencoba untuk menjebak SIGWINCH di bash, tampaknya itu tidak pernah diterima. Ini diuji dengan:

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

Yang seharusnya membuat kedua file di direktori home saya. Itu hanya dibuat /home/user/sigusr1.

Mencoba untuk kill -s SIGWINCH $$tidak menyebabkan pembaruan variabel $ COLUMNS / $ LINES.

Mengaktifkan checkwinsize( shopt -s checkwinsize) akan menyebabkan bash memperbarui $ COLUMNS / $ LINES setelah kembali dari aplikasi apa pun (seperti yang diharapkan). Ini mengarah ke hal-hal berikut setelah mengubah ukuran terminal dengan checkwinsizediaktifkan:

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

Mengubah shell login saya menjadi sesuatu seperti tcsh dan mencoba mengubah ukuran terminal berfungsi seperti yang diharapkan, seperti halnya bash pada kotak lain yang saya uji.

Saya mencoba menghapus .bashrc saya dan tidak berhasil. Masalah ini terjadi untuk beberapa pengguna lain dengan konfigurasi bash yang bervariasi di Putty dan semacam terminal tipe rxvt dari kotak Linux.

strace

Saya berlari strace pada bash dan mencoba mengubah ukuran terminal, tidak ada yang datang (tetap diblokir pada readpanggilan segera setelah mencetak prompt).

Aku memukul balik pada baris kosong, dan bash melakukan banyak hal. Output yang saya yakini relevan adalah: ( strace penuh )

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,

Yang menunjukkan bash, menurut pemahaman saya: (Saya bisa salah paham tentang ini. Saya jauh dari elemen saya di sini.)

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 yang sama ini dilakukan pada kotak tanpa masalah ini (Ubuntu, bash 4.2.24 (1)) menghasilkan:

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,

Pertanyaan

Apa yang sedang terjadi dan mengapa bash saya rusak? :(

Saya kira mungkin hanya ada opsi di suatu tempat yang default ke sesuatu yang tidak terduga, tetapi jam di Google tidak menghasilkan apa-apa.

Bantuan dan / atau petunjuk sangat dihargai. Ini benar-benar membuat frustrasi.

Terima kasih.

NuclearDog
sumber
Anda bukan yang pertama: lists.gnu.org/archive/html/bug-bash/2007-01/msg00084.html Jika Anda exec bashmenggunakan tangan (jadi ini bukan lagi shell login) apakah masih bermasalah? Jika tidak, bagaimana dengan exec bash -l(jadi itu shell login)? Jika demikian, maka ada sesuatu yang terjadi dengan skrip login Anda ( /etc/profile /etc/profile.d/ ~/.bash_profile ~/.profile), tapi saya bahkan tidak tahu harus mengatakan apa kepada Anda untuk mencari yang dapat memberitahu shell untuk tidak melakukannya SIGWINCH.
DerfK
Keduanya exec bashdan exec bash -lmenunjukkan perilaku yang sama. Saya kira ini adalah penghiburan kecil bahwa saya tidak sendirian dalam hal ini. Saya benar-benar bingung tentang apa yang menyebabkan ini. Colo memasang instalasi minimal dari gambar Debian yang baru diunduh. Saya harus mencoba menginstal secara lokal dan melihat apakah ada masalah dan (dengan asumsi tidak ada, karena ini tampaknya tidak terjadi untuk orang lain), mulai membandingkan dengan sistem yang sedang berjalan.
NuclearDog
Saya melakukan instalasi baru di VM, menghasilkan daftar jumlah md5 dari semua file di / etc dan / usr dan dibandingkan dengan sistem yang rusak. Sekilas, aku tidak bisa melihat ada yang salah. /etc/bash.bashrcdan semua /etc/profiledan /etc/profile.dfile tidak berubah dari instalasi yang bersih. Saya telah mengunduh sumber bash ( apt-get source bash) dan saya bermain dengan berbagai argumen ./configureuntuk mencoba dan mempersempit masalahnya sebelum saya menggali sumbernya.
NuclearDog
Saya mengkompilasi bash minus semua tambalan Debian --disable-readline --enable-minimal-config --disable-job-control, menjalankan strace untuk melihat file yang mana open, mengganti nama semua file itu, lalu login lagi. Masalah yang sama. Saya cukup jelas mengesampingkan perubahan konfigurasi dengan bash itu sendiri.
NuclearDog
Saya telah mereplikasi masalah yang sama dengan bash 3.2, 4.1 dan 4.2 yang dikompilasi dari sumber yang diambil langsung dari GNU. Saya tidak dapat mengkompilasi 4.2 tanpa kontrol pekerjaan dan dengan konfigurasi minimal karena beberapa bug (dilaporkan ke tim bash). Mengingat ini terjadi dengan beberapa versi bash, saya mulai percaya bahwa kesalahan mungkin ada pada salah satu pustaka yang bergantung padanya. Pindah ke itu.
NuclearDog

Jawaban:

11

Sesuatu telah menggangguku tentang output strace. Yaitu bahwa tampaknya ketika pesta dimulai, sepertinya sudah SIGWINCH bertopeng. Tidak bisa memastikan, tidak mengerti setengah dari apa yang dimuntahkannya, tapi itu layak untuk dijelajahi pada saat ini.

Saya lari strace -o strace_file bash -ldari shell tcsh, di mana masalahnya tidak ada. bash tidak pernah bertopeng SIGWINCH. Ketika menutupinya, itu hanya karena berusaha memulihkan topeng sebelumnya. Jadi dari mana topeng awal itu berasal?

Beberapa waktu lagi di Google dan pikiran yang segar dan saya menemukan posting ini yang menyebutkan bahwa aptitude kadang-kadang dapat menyebabkan sshd dimulai dengan SIGWINCH bertopeng, dan kemudian akan diwarisi oleh semua proses yang muncul langsung ke shell.

Saya mencoba ps axwwws(semua, terlepas, keluaran lebar, sinyal). Ini menunjukkan beberapa proses sshd yang telah bertelur SIGWINCH.

Server / proses mendengarkan (sshd sendiri) tidak. Juga tidak proses yang menggunakan koneksi hosting yang menggunakan tcsh. Bagian itu membingungkan saya. Saya menduga (sekali lagi, mengetahui sedikit tentang semua ini) bahwa sinyalnya adalah lebar proses-kelompok atau sesuatu, tcsh sedang mengatur ulang pada awal, dan itu juga mempengaruhi ssh.

Jadi, atas kemauan, saya terhubung dengan tcsh (untuk mendapatkan istilah yang bersih tanpa topeng SIGWINCH), restart ssh, mengubah shell saya kembali ke bash ... Dan itu berhasil! Semuanya kembali normal!

Sejauh yang saya tahu aptitude belum dijalankan di kotak ini, dan ssh telah dimulai kembali beberapa kali untuk perubahan konfigurasi. Namun, di suatu tempat di sepanjang garis topeng itu masuk, dan menginfeksi segala sesuatu seperti penyakit buruk.

Untuk mengenali masalah yang sama, jalankan ps axwwws | grep sshddan cari proses sshd dengan kolom panjang kedua ( BLOCKED) memiliki set 0x8000000. Itu SIGWINCH. Sesuatu seperti:

   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

Untuk memperbaikinya (mungkin bukan solusi terbaik, bekerja untuk saya):

$ 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

Dan itu sudah diperbaiki.

Bersulang!

NuclearDog
sumber
1

Coba ini. Melakukan

bash$ shopt -s checkwinsize

di shell Anda, lalu ubah ukuran jendela terminal Anda.

gjvc
sumber
2
Selamat datang di ServerFault. Apakah Anda memperhatikan bahwa pengguna telah memecahkan masalah ini bertahun-tahun yang lalu?
anak ayam
1
Tampak seperti solusi bagi saya menggunakan tcsh bukan bash.
gjvc