Debian SSH - Thay đổi kích thước thiết bị đầu cuối không đăng ký với bash


11

Gần đây chúng tôi đã cài đặt lại máy chủ của mình do lỗi đĩa và hiện tại chúng tôi đang gặp sự cố với thay đổi kích thước thiết bị đầu cuối. Chúng tôi đã cài đặt Debian 6.0.6.

Triệu chứng

Khi bạn thay đổi kích thước thiết bị đầu cuối, không có ứng dụng dựa trên ncurses nào (đã thử nghiệm: ytalk, irssi, screen, tmux, một số ứng dụng ví dụ của ncurses) dường như thay đổi kích thước chính xác. Màn hình thường kết thúc trống. Buộc vẽ lại trong ứng dụng sẽ vẽ lại bằng kích thước thiết bị đầu cuối cũ.

Khi thay đổi kích thước cửa sổ tại dấu nhắc bash (4.1.5 (1)), các biến COLUMNS và LINES không bao giờ được cập nhật.

Chẩn đoán

Cố gắng bẫy SIGWINCH trong bash, có vẻ như nó không bao giờ được nhận. Điều này đã được thử nghiệm với:

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

Mà nên tạo cả hai tập tin trong thư mục nhà của tôi. Nó chỉ được tạo ra /home/user/sigusr1.

Cố gắng kill -s SIGWINCH $$không gây ra cập nhật các biến $ COLUMNS / $ LINES.

Kích hoạt checkwinsize( shopt -s checkwinsize) sẽ khiến bash cập nhật $ COLUMNS / $ LINES khi trở về từ bất kỳ ứng dụng nào (như mong đợi). Điều này dẫn đến những điều sau đây sau khi thay đổi kích thước thiết bị đầu cuối checkwinsizeđược kích hoạt:

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

Thay đổi vỏ đăng nhập của tôi thành một cái gì đó như tcsh và cố gắng thay đổi kích thước thiết bị đầu cuối hoạt động như mong đợi, cũng như bash trên các hộp khác mà tôi đã thử nghiệm.

Tôi đã thử xóa .bashrc của tôi và nó không làm gì cả. Vấn đề này xảy ra đối với một số người dùng khác với các cấu hình bash khác nhau trong cả PuTTY và một số loại thiết bị đầu cuối loại rxvt từ hộp Linux.

bước đi

Tôi đã chạy strace trên bash và thử thay đổi kích thước thiết bị đầu cuối, không có gì xảy ra (nó vẫn bị chặn trong một readcuộc gọi ngay sau khi in lời nhắc).

Tôi quay trở lại trên một dòng trống, và bash đã làm cả đống thứ. Đầu ra tôi tin là có liên quan là: ( toàn bộ bước )

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,

Điều này cho thấy bash, theo sự hiểu biết của tôi: (Tôi có thể hiểu nhầm khủng khiếp điều này. Tôi thoát khỏi yếu tố của tôi ở đây.)

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.

Chính bước này được thực hiện trên một hộp không có các vấn đề này (Ubuntu, bash 4.2.24 (1)) dẫn đến:

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,

Câu hỏi

Chuyện quái gì đang xảy ra và tại sao bash của tôi bị hỏng? :

Tôi đoán có lẽ chỉ có một tùy chọn ở đâu đó được mặc định là điều bất ngờ, nhưng hàng giờ trên Google đã không có gì.

Bất kỳ trợ giúp và / hoặc con trỏ được đánh giá rất cao. Điều này thực sự bực bội.

Cảm ơn bạn.


Bạn không phải là người đầu tiên : lists.gnu.org/archive/html/orms-bash/2007-01/msg00084.html Nếu bạn exec bashbằng tay (vì vậy nó không còn là vỏ đăng nhập) liệu nó có còn hoạt động sai không? Nếu không, những gì về exec bash -l(vì vậy nó là một vỏ đăng nhập)? Nếu vậy, thì có gì đó phù hợp với tập lệnh đăng nhập của bạn ( /etc/profile /etc/profile.d/ ~/.bash_profile ~/.profile), nhưng tôi thậm chí không biết phải nói gì với bạn để tìm kiếm có thể nói với trình bao không SIGWINCH.
DerfK

Cả hai exec bashexec bash -lthể hiện cùng một hành vi. Tôi cho rằng đó là một niềm an ủi nhỏ mà tôi không đơn độc trong việc này. Tôi hoàn toàn bối rối về những gì sẽ gây ra điều này, mặc dù. Colo đã cài đặt một bản cài đặt tối thiểu từ hình ảnh Debian mới tải xuống. Tôi sẽ phải thử cài đặt cục bộ và xem có vấn đề gì không và (giả sử là không có, vì điều này dường như không xảy ra với người khác), bắt đầu so sánh với hệ thống đang chạy.
NucleDog

Tôi đã thực hiện cài đặt mới trong VM, tạo danh sách tổng md5 của tất cả các tệp trong / etc và / usr và so sánh với hệ thống bị hỏng. Nhìn thoáng qua, tôi không thể thấy bất cứ điều gì rõ ràng sai. /etc/bash.bashrcvà tất cả các tệp /etc/profile/etc/profile.dtệp không thay đổi từ bản cài đặt sạch. Tôi đã tải xuống nguồn bash ( apt-get source bash) và đang chơi với nhiều đối số khác nhau ./configuređể thử và thu hẹp vấn đề trước khi tôi tìm hiểu về nguồn.
NucleDog

Tôi đã biên dịch bash trừ tất cả các bản vá Debian --disable-readline --enable-minimal-config --disable-job-control, chạy một bước để xem tập tin nào open, đổi tên tất cả các tập tin đó, sau đó đăng nhập lại. Cùng một vấn đề. Tôi hoàn toàn loại trừ bất kỳ thay đổi cấu hình nào với chính bash.
NucleDog

Tôi đã sao chép cùng một vấn đề với bash 3.2, 4.1 và 4.2 được biên dịch từ các nguồn được lấy trực tiếp từ GNU. Tôi không thể biên dịch 4.2 mà không có kiểm soát công việc và với cấu hình tối thiểu do một số lỗi (được báo cáo cho nhóm bash). Cho rằng điều này xảy ra với một số phiên bản bash, tôi bắt đầu tin rằng lỗi có thể nằm ở một trong những thư viện mà nó phụ thuộc. Chuyển sang đó.
NucleDog

Câu trả lời:


11

Một cái gì đó đã làm tôi khó chịu về đầu ra bước đi. Cụ thể là dường như khi bash bắt đầu, có vẻ như nó đã bị SIGWINCH đeo mặt nạ. Không thể chắc chắn, không hiểu một nửa những gì nó được phun ra, nhưng nó chắc chắn đáng để khám phá vào thời điểm này.

Tôi đã chạy strace -o strace_file bash -ltừ một vỏ tcsh, nơi mà vấn đề không có mặt. bash không bao giờ che dấu SIGWINCH. Khi nó che giấu nó, đó chỉ là vì nó đã cố gắng khôi phục mặt nạ trước đó. Vậy mặt nạ ban đầu đến từ đâu?

Một thời gian nữa trên Google và một tâm trí mới mẻ và tôi thấy bài đăng này đã đề cập rằng năng khiếu đôi khi có thể khiến sshd được bắt đầu với mặt nạ SIGWINCH và sau đó nó sẽ được kế thừa bởi tất cả các quy trình được sinh ra thẳng vào vỏ.

Tôi đã thử ps axwwws(tất cả, tách ra, đầu ra rộng, tín hiệu). Nó cho thấy một số quá trình sshd được sinh ra đã che dấu SIGWINCH.

Quá trình máy chủ / nghe (sshd chính nó) đã không. Cũng không có các quá trình lưu trữ kết nối sử dụng tcsh. Đó là phần khó hiểu với tôi. Tôi đoán (một lần nữa, biết rất ít về bất kỳ điều gì trong số này) rằng mặt nạ tín hiệu rộng toàn nhóm hoặc một cái gì đó, tcsh đã đặt lại nó khi bắt đầu và điều đó cũng ảnh hưởng đến ssh.

Vì vậy, trong một ý thích bất chợt, tôi đã kết nối với tcsh (để có một thuật ngữ rõ ràng không có mặt nạ SIGWINCH), khởi động lại ssh, thay đổi vỏ của tôi thành bash ... Và nó đã hoạt động! Mọi thứ trở lại bình thường!

Theo như tôi biết thì aptitude chưa được chạy trên hộp này và ssh đã được khởi động lại một vài lần để thay đổi cấu hình. Tuy nhiên, ở đâu đó, mặt nạ đã đi vào và nhiễm mọi thứ như một căn bệnh tồi tệ.

Để nhận ra cùng một vấn đề, hãy chạy ps axwwws | grep sshdvà tìm các tiến trình sshd với cột dài thứ hai ( BLOCKED) có 0x8000000 được đặt. Đó là SIGWINCH. Cái gì đó như:

   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

Để khắc phục nó (có thể không phải là giải pháp tốt nhất, đã làm việc cho tôi):

$ 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

Và nó đã được sửa.

Chúc mừng!


1

Thử đi. Làm

bash$ shopt -s checkwinsize

trong vỏ của bạn, sau đó thay đổi kích thước cửa sổ đầu cuối của bạn.


2
Chào mừng bạn đến với ServerFault. Bạn có để ý rằng người dùng đã giải quyết vấn đề này từ nhiều năm trước không?
gà con

1
Trông giống như một cách giải quyết với tôi bằng cách sử dụng tcsh thay vì bash.
gjvc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.