डेबियन एसएसएच - रीसाइज़िंग टर्मिनल बैश के साथ पंजीकृत नहीं है


11

हमने हाल ही में डिस्क विफलता के कारण हमारे सर्वर को फिर से इंस्टॉल किया है, और अब हम टर्मिनलों को आकार देने के साथ एक समस्या है। हमने डेबियन 6.0.6 स्थापित किया।

लक्षण

जब आप एक टर्मिनल का आकार बदलते हैं, तो कोई ncurses- आधारित एप्लिकेशन (परीक्षण किया गया: ytalk, irssi, स्क्रीन, tmux, कुछ ncurses उदाहरण अनुप्रयोग) सही ढंग से आकार बदलने लगते हैं। स्क्रीन आमतौर पर खाली होती है। आवेदन में एक redraw मजबूर पुराने टर्मिनल आकार का उपयोग कर redraw जाएगा।

जब एक bash (4.1.5 (1)) प्रॉम्प्ट पर विंडो का आकार बदलते हैं, तो COLUMNS और LINES वैरिएबल कभी अपडेट नहीं होते हैं।

निदान

SIGWINCH को फँसाने के प्रयास में, ऐसा लगता है कि यह कभी प्राप्त नहीं हो रहा है। इसके साथ परीक्षण किया गया था:

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 निकालने की कोशिश की और इसने कुछ नहीं किया। यह समस्या कई अन्य उपयोगकर्ताओं के लिए PuTTY में अलग-अलग बैश कॉन्फ़िगरेशन और लिनक्स बॉक्स से कुछ प्रकार के rxvt- प्रकार टर्मिनल के साथ हो रही है।

strace

मैं बैश पर स्ट्रेच भाग गया और टर्मिनल को आकार देने की कोशिश की, कुछ भी नहीं आया (यह 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.

इन मुद्दों के बिना एक बॉक्स पर इसी स्ट्रेस का प्रदर्शन किया गया (उबंटू, बैश 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 पर घंटों कुछ भी नहीं हुआ है।

किसी भी मदद और / या संकेत बहुत सराहना की है। यह वास्तव में निराशाजनक है।

धन्यवाद।


आप पहले वाले नहीं हैं: lists.gnu.org/archive/html/bug-bash/2007-01/msg00084.html यदि आप exec bashहाथ से हैं (तो यह अब लॉगिन शेल नहीं है) क्या यह अभी भी दुर्व्यवहार करता है? यदि नहीं, तो किस बारे में exec bash -l(इसलिए यह एक लॉगिन शेल है)? यदि ऐसा है, तो आपके लॉगिन स्क्रिप्ट ( /etc/profile /etc/profile.d/ ~/.bash_profile ~/.profile) के साथ कुछ है , लेकिन मुझे यह भी नहीं पता है कि आपको क्या बताना है जो आपको ढूंढना है, शेल को नहीं बता सकता है SIGWINCH
DerfK

दोनों exec bashऔर exec bash -lएक ही व्यवहार दर्शाते हैं। मुझे लगता है कि यह एक छोटी सांत्वना है कि मैं इसमें अकेला नहीं हूं। मैं अच्छी तरह से उलझन में हूँ कि यह क्या कारण होगा, हालांकि। कोलो ने ताजा डाउनलोड की गई डेबियन छवि से एक न्यूनतम स्थापित किया। मुझे स्थानीय रूप से स्थापित करने का प्रयास करना होगा और देखना होगा कि क्या कोई समस्या है और (कोई नहीं मान रहा है, क्योंकि यह अन्य लोगों के लिए नहीं होता है), चल प्रणाली की तुलना करना शुरू करें।
न्यूक्लियरडॉग

मैंने एक वीएम में एक ताजा स्थापित किया, / etc / और usr में सभी फाइलों की md5 रकम की सूची तैयार की और टूटी प्रणाली के खिलाफ तुलना की। त्वरित नज़र में, मैं स्पष्ट रूप से कुछ भी गलत नहीं देख सकता। /etc/bash.bashrcऔर सभी /etc/profileऔर /etc/profile.dफ़ाइलें एक क्लीन इंस्टाल से अपरिवर्तित हैं। मैंने bash स्रोत डाउनलोड किया है ( apt-get source bash) और ./configureस्रोत में खुदाई करने से पहले समस्या को कम करने और कम करने के लिए विभिन्न तर्कों के साथ खेल रहा हूं।
न्यूक्लियरडॉग

मैंने बैब माइनस को सभी डेबियन पैचों के साथ संकलित किया --disable-readline --enable-minimal-config --disable-job-control, यह देखने के लिए एक स्ट्रींग चलाई कि यह किस फाइल openकी डी है, उन सभी फाइलों का नाम बदला, फिर दोबारा लॉग इन किया। वही मुद्दा। मैं निश्चित रूप से निश्चित रूप से बैश के साथ किसी भी कॉन्फ़िगरेशन परिवर्तन से इंकार करता हूं।
न्यूक्लियरडॉग

मैंने एक ही मुद्दे को 3.2, 4.1 और 4.2 के साथ दोहराया है, जो कि सीधे GNU से प्राप्त स्रोतों से संकलित है। मैं कुछ बग्स (बश टीम को सूचना दी) के कारण नौकरी नियंत्रण के बिना और न्यूनतम विन्यास के साथ ४.२ संकलन में असमर्थ था। यह देखते हुए कि यह कई प्रकार के बैश के साथ होता है, मुझे विश्वास है कि त्रुटि पुस्तकालयों में से एक के साथ झूठ हो सकती है, इस पर निर्भर होने लगी है। उस पर चलते हुए।
न्यूक्लियरडॉग

जवाबों:


11

स्ट्रेस आउटपुट के बारे में मुझे कुछ बुरा लगा था। अर्थात् यह लग रहा था कि जब बैश शुरू हुआ था, ऐसा लग रहा था कि इसमें पहले से ही SIGWINCH अंकित था। यकीन नहीं किया जा सकता था, समझ में नहीं आया कि यह क्या था, लेकिन यह इस बिंदु पर कुछ अन्वेषण के लायक था।

मैं strace -o strace_file bash -lएक टीएसएच शेल से भाग गया , जहां मुद्दा मौजूद नहीं था। बैश ने कभी भी SIGWINCH का मुखौटा नहीं लगाया। जब यह इसे मास्क कर रहा था, तो यह केवल इसलिए था क्योंकि यह पिछले मास्क को पुनर्स्थापित करने का प्रयास कर रहा था। तो शुरुआती मुखौटा कहाँ से आ रहा था?

Google पर कुछ और समय और एक ताजा दिमाग और मैंने इस पोस्ट को पाया जिसमें उल्लेख किया गया है कि योग्यता कभी-कभी SIGWINCH नकाबपोश के साथ शुरू करने का कारण बन सकती है, और यह तब खोल के नीचे सभी स्पॉन्डेड प्रक्रियाओं द्वारा विरासत में मिलेगा।

मैंने कोशिश की ps axwwws(सभी, अलग, व्यापक आउटपुट, संकेत)। यह दिखाया गया है कि कई sshd sshd प्रक्रियाओं में SIGWINCH नकाबपोश थे।

सर्वर / सुनने की प्रक्रिया (sshd ही) नहीं हुई। और न ही वे प्रक्रियाएं जो कनेक्शन की मेजबानी कर रही थीं जो टीसीएस का उपयोग करती थीं। वह हिस्सा मुझे भ्रमित कर रहा है। मैं अनुमान लगा रहा हूं (फिर, इस बारे में बहुत कम जानते हुए भी) कि सिग्नल मास्क प्रक्रिया-समूह चौड़ा है या कुछ और है, टीसीएस इसे शुरू में रीसेट कर रहा था, और इससे एसएचएस भी प्रभावित हो रहा था।

इसलिए, एक सनक पर, मैं tcsh (बिना SIGWINCH मास्क के साथ एक साफ शब्द प्राप्त करने के लिए) से जुड़ा, ssh को फिर से शुरू किया, अपने खोल को बैश में बदल दिया ... और यह काम कर गया! सब कुछ वापस सामान्य करने के लिए!

जहां तक ​​मुझे पता है कि इस बॉक्स पर एप्टीट्यूड नहीं चलाया गया है, और कॉन्फ़िगरेशन परिवर्तन के लिए ssh को कुछ बार फिर से शुरू किया गया है। रेखा के साथ कहीं न कहीं मास्क ने अपना रास्ता बना लिया, और एक बुरी बीमारी की तरह हर चीज को संक्रमित कर दिया।

इसी मुद्दे को पहचानने के ps axwwws | grep sshdलिए, दूसरे लंबे कॉलम ( BLOCKED) में 0x8000000 सेट के साथ sshd प्रोसेस को रन करें और देखें । वह सिगिन्च है। कुछ इस तरह:

   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 का उपयोग करते हुए मुझे वर्कअराउंड की तरह देखा।
gjvc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.