Debian SSH - เทอร์มินัลการปรับขนาดไม่ได้ลงทะเบียนด้วย bash


11

เราเพิ่งติดตั้งเซิร์ฟเวอร์ของเราอีกครั้งเนื่องจากความล้มเหลวของดิสก์และตอนนี้เรากำลังมีปัญหากับการปรับขนาดเทอร์มินัล เราติดตั้ง Debian 6.0.6

อาการ

เมื่อคุณปรับขนาดเทอร์มินัลไม่มีแอพที่ใช้ ncurses (ทดสอบแล้ว: ytalk, irssi, หน้าจอ, tmux, ตัวอย่างแอพพลิเคชั่น ncurses) ดูเหมือนจะปรับขนาดอย่างถูกต้อง โดยทั่วไปหน้าจอจะว่างเปล่า การบังคับให้วาดใหม่ในแอปพลิเคชันจะวาดใหม่โดยใช้ขนาดเทอร์มินัลเก่า

เมื่อปรับขนาดหน้าต่างที่พร้อมท์ 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) จะทำให้ bash อัปเดต $ COLUMNS / $ LINES เมื่อกลับมาจากแอปพลิเคชันใด ๆ (ตามที่คาดไว้) สิ่งนี้นำไปสู่สิ่งต่อไปนี้หลังจากปรับขนาดเทอร์มินัลด้วยการcheckwinsizeเปิดใช้งาน:

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

การเปลี่ยนเชลล์ล็อกอินของฉันเป็นอะไรเช่น tcsh และพยายามปรับขนาดเทอร์มินัลทำงานตามที่คาดไว้เช่นเดียวกับทุบตีในกล่องอื่น ๆ ที่ฉันทดสอบ

ฉันพยายามลบ. bashrc และไม่ได้ทำอะไรเลย ปัญหานี้เกิดขึ้นสำหรับผู้ใช้อื่น ๆ ที่มีการกำหนดค่า bash ที่แตกต่างกันทั้ง PuTTY และเทอร์มินัลชนิด rxvt บางประเภทจากกล่อง Linux

strace

ฉันวิ่ง strace บนทุบตีและพยายามปรับขนาดเทอร์มินัลไม่มีอะไรผ่าน (มันยังคงถูกบล็อกในการreadโทรทันทีหลังจากพิมพ์พรอมต์)

ฉันตีกลับในบรรทัดที่ว่างเปล่าและทุบตีได้ทุกสิ่ง ผลลัพธ์ที่ฉันเชื่อว่าเกี่ยวข้อง: ( 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,

ซึ่งแสดงถึงการทุบตีเพื่อความเข้าใจของฉัน: (ฉันอาจจะเข้าใจผิดอย่างน่ากลัวนี้ฉันออกจากองค์ประกอบของฉันที่นี่)

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 แบบเดียวกันนี้ดำเนินการบนกล่องโดยไม่มีปัญหาเหล่านี้ (Ubuntu, bash 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แสดงพฤติกรรมเดียวกัน ฉันคิดว่ามันเป็นความปลอบใจเล็กน้อยที่ฉันไม่ได้อยู่คนเดียวในเรื่องนี้ ฉันสับสนอย่างถี่ถ้วนถึงสิ่งที่จะทำให้เกิดสิ่งนี้ colo ติดตั้งการติดตั้งขั้นต่ำจากอิมเมจ Debian ที่ดาวน์โหลดใหม่ ฉันจะต้องลองติดตั้งในเครื่องและดูว่ามีปัญหาหรือไม่และ (สมมติว่าไม่มีเนื่องจากสิ่งนี้ดูเหมือนจะไม่เกิดขึ้นกับคนอื่น) เริ่มเปรียบเทียบกับระบบที่กำลังทำงานอยู่
NuclearDog

ฉันติดตั้งใหม่ใน VM สร้างรายการผลรวม md5 ของไฟล์ทั้งหมดใน / etc และ / usr และเปรียบเทียบกับระบบที่เสียหาย ฉันไม่เห็นอะไรผิดปกติอย่างชัดเจน /etc/bash.bashrcและไฟล์ทั้งหมด/etc/profileและ/etc/profile.dไม่เปลี่ยนแปลงจากการติดตั้งใหม่ทั้งหมด ฉันดาวน์โหลด bash source ( apt-get source bash) และกำลังเล่นกับอาร์กิวเมนต์ต่าง ๆ./configureเพื่อลองและ จำกัด ปัญหาให้แคบลงก่อนที่จะขุดลงในซอร์ส
NuclearDog

ฉันรวบรวมทุบตีลบด้วยแพทช์เดเบียนทั้งหมด--disable-readline --enable-minimal-config --disable-job-controlวิ่ง strace เพื่อดูไฟล์ที่มันopenเปลี่ยนชื่อไฟล์ทั้งหมดจากนั้นเข้าสู่ระบบอีกครั้ง ปัญหาเดียวกัน ฉันค่อนข้างจะปกครองการเปลี่ยนแปลงการกำหนดค่าอย่างแน่นอนด้วยการทุบตีตัวเอง
NuclearDog

ฉันทำซ้ำปัญหาเดียวกันกับ bash 3.2, 4.1 และ 4.2 ที่รวบรวมจากแหล่งที่ดึงมาโดยตรงจาก GNU ฉันไม่สามารถรวบรวม 4.2 โดยไม่มีการควบคุมงานและมีการกำหนดค่าน้อยที่สุดเนื่องจากข้อบกพร่องบางอย่าง (รายงานไปยังทีมทุบตี) ระบุว่าสิ่งนี้เกิดขึ้นกับการทุบตีหลายเวอร์ชันฉันเริ่มเชื่อว่าข้อผิดพลาดอาจอยู่กับห้องสมุดใดห้องสมุดหนึ่งที่ขึ้นอยู่กับ ย้ายไปที่
NuclearDog

คำตอบ:


11

มีบางอย่างดักฟังฉันเกี่ยวกับผลลัพธ์ที่ออกมา นั่นคือดูเหมือนว่าเมื่อทุบตีเริ่มต้นก็ดูเหมือนว่าได้สวมหน้ากาก SIGWINCH แล้ว ไม่สามารถแน่ใจได้ไม่เข้าใจครึ่งหนึ่งของสิ่งที่มันคายออกมา แต่มันก็คุ้มค่ากับการสำรวจเมื่อถึงจุดนี้

ฉันวิ่งstrace -o strace_file bash -lออกมาจากเปลือก tcsh ซึ่งไม่มีปัญหาอยู่ ทุบตีไม่เคยสวมหน้ากาก SIGWINCH เมื่อทำการปิดบังมันเป็นเพียงเพราะมันพยายามที่จะกู้คืนมาสก์ก่อนหน้า แล้วหน้ากากเริ่มต้นมาจากไหน?

บางเวลาบน Google และจิตใจที่สดใหม่และฉันพบโพสต์นี้ซึ่งกล่าวว่าความถนัดอาจทำให้ sshd เริ่มต้นด้วย SIGWINCH ซึ่งถูกหลอกลวงและมันจะถูกสืบทอดโดยกระบวนการที่วางไข่ทั้งหมดลงไปที่เปลือก

ฉันลองps axwwws(สัญญาณทั้งหมด, แยกออก, เป็นวงกว้าง, สัญญาณ) มันแสดงให้เห็นว่ากระบวนการ sshd ที่เกิดใหม่หลายตัวได้ถูกสวมหน้ากาก SIGWINCH

กระบวนการเซิร์ฟเวอร์ / การฟัง (ตัว sshd) ไม่ได้ กระบวนการที่เป็นการโฮสต์เชื่อมต่อซึ่งไม่ใช้ tcsh ส่วนนั้นทำให้ฉันสับสน ฉันคาดเดา (อีกรู้น้อยมากเกี่ยวกับเรื่องนี้) ว่ารูปแบบสัญญาณคือกระบวนการกลุ่มกว้างหรือบางอย่าง tcsh กำลังรีเซ็ตเมื่อเริ่มต้นและนั่นก็ส่งผลกระทบต่อ ssh เช่นกัน

ดังนั้นในราชประสงค์ฉันเชื่อมต่อกับ tcsh (เพื่อให้ได้คำศัพท์ที่สะอาดโดยไม่มีหน้ากาก SIGWINCH) เริ่ม ssh เปลี่ยนเชลล์ของฉันกลับเป็นทุบตี ... และมันก็ใช้ได้! ทุกอย่างกลับสู่ปกติ!

เท่าที่ฉันรู้ความถนัดไม่ได้ทำงานในกล่องนี้และ ssh ได้รับการรีสตาร์ทสองสามครั้งสำหรับการเปลี่ยนแปลงการกำหนดค่า บางแห่งตามแนวหน้ากากก็เข้ามาถึงและติดเชื้อทุกอย่างเช่นโรคร้าย

เมื่อต้องการรับรู้ปัญหาเดียวกันให้เรียกใช้ps axwwws | grep sshdและค้นหากระบวนการ sshd ด้วยคอลัมน์ที่สองยาว ( BLOCKED) ได้ตั้งค่า 0x8000000 นั่นคือซิกวิน สิ่งที่ต้องการ:

   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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.