อะไรคือความรับผิดชอบของแต่ละองค์ประกอบ Pseudo-Terminal (PTY) (ซอฟต์แวร์ด้านหลักด้านทาส)


59

ฉันพยายามคิดว่า tty ทำงานอย่างไร1 (กระบวนการทำงานและความรับผิดชอบของแต่ละองค์ประกอบ) ฉันได้อ่านบทความที่น่าสนใจหลายเรื่องเกี่ยวกับเรื่องนี้ แต่ยังมีบางพื้นที่ที่พร่ามัว

นี่คือสิ่งที่ฉันเข้าใจ:

  • เทอร์มินัลที่จำลองทำให้การเรียกใช้ระบบแตกต่างกันไป/dev/ptmxส่วนหลักของเทอร์มินัลหลอก
  • ส่วนหลักของเทอร์มินัลหลอกหลอกจัดสรรไฟล์/dev/pts/[0-N]ให้สอดคล้องกับพอร์ตอนุกรมที่ล้าสมัยและ "แนบ" เทอร์มินัลหลอกหลอกไปที่มัน
  • เทอร์มินัลหลอกหลอกเก็บข้อมูลเช่นรหัสเซสชันงานพื้นหน้าจอขนาด

นี่คือคำถามของฉัน:

  1. ptmxมีจุดประสงค์อื่นนอกเหนือจากการจัดสรรส่วนทาสหรือไม่? มันจัดให้มี "ปัญญา" บางชนิดหรือเทอร์มินัลจำลอง (เช่น xterm) มีสติปัญญาทั้งหมดของการทำงานเหมือนเทอร์มินัลหรือไม่?
  2. ทำไม xtermจึงต้องโต้ตอบกับชิ้นส่วนหลักเพราะมันจะส่งต่อ stdout และ stdin ของส่วนทาสเท่านั้น ทำไมถึงไม่สามารถมัน โดยตรงเขียนและอ่านจากแฟ้มจุด ?
  3. ID เซสชันจะแนบกับไฟล์ pts หนึ่งไฟล์และในทางกลับกันหรือไม่ ฉันสามารถพิมพ์คำสั่ง ps และพบ2 sessionId สำหรับ / dev / pts / X เดียวกันได้หรือไม่
  4. ข้อมูลอื่น ๆ ของptsร้านค้า? Xterm อัปเดตทุกฟิลด์ด้วยตัวเองหรือไม่หรือจะptmเพิ่ม "ความฉลาด" บางส่วนไว้ในนั้นหรือไม่?

1. ฉันใช้ความเข้าใจพื้นฐานเกี่ยวกับTTY ที่ demystified โดย Linus AkessonและLinux Kernel โดย Andries Brouwerโพสต์เช่นเดียวกับคำถามอื่น ๆในเว็บไซต์เหล่านี้

คำตอบ:


58

เทอร์มินัลอีมูเลเตอร์

ฝั่งต้นแบบจะแทนที่เส้น (คู่ของสาย TX / RX) ที่ไปยังเทอร์มินัล

เทอร์มินัลจะแสดงตัวอักษรที่รับมาจากสายไฟหนึ่งเส้น (บางสายเป็นตัวควบคุมและทำให้สิ่งต่าง ๆ เช่นเลื่อนเคอร์เซอร์เปลี่ยนสี ... ) และส่งต่อสายอื่นตามอักขระที่คุณพิมพ์

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

นอกจากนั้นยังมีความฉลาดเล็กน้อยในเทอร์มินัลอีมูเลเตอร์ / เทอร์มินัล

สิ่งที่คุณเขียนไปยังอุปกรณ์เทอร์มินัล (เช่นทาส pty) คือสิ่งที่คุณหมายถึงที่จะแสดงที่นั่นสิ่งที่คุณอ่านจากมันคือสิ่งที่คุณได้พิมพ์ที่นั่นดังนั้นจึงไม่เหมาะสมที่ terminal emulator อ่านหรือเขียน . พวกเขาเป็นคนที่ปลายอีกด้าน


วินัยของ tty line

จำนวนมากของหน่วยสืบราชการลับอยู่ในวินัยสาย TTY Line discipline เป็นโมดูลซอฟต์แวร์ (อยู่ในไดรเวอร์ในเคอร์เนล) ผลักด้านบนของอุปกรณ์อนุกรม / pty ที่อยู่ระหว่างอุปกรณ์นั้นและบรรทัด / สาย (ด้านต้นแบบสำหรับ pty)

สายอนุกรมสามารถมีเทอร์มินัลที่ปลายอีกด้านหนึ่ง แต่ยังมีเมาส์หรือคอมพิวเตอร์เครื่องอื่นสำหรับการเชื่อมต่อเครือข่าย คุณสามารถแนบวินัยไลน์ SLIP เพื่อรับอินเทอร์เฟซเครือข่ายที่ด้านบนของอุปกรณ์อนุกรม (หรืออุปกรณ์ pty) หรือคุณสามารถมีระเบียบวินัยบรรทัดtty วินัยของ tty line เป็นวินัยของบรรทัดเริ่มต้นอย่างน้อยบน Linux สำหรับอุปกรณ์อนุกรมและ pty บน Linux ldattachคุณสามารถเปลี่ยนวินัยบรรทัดด้วย

คุณสามารถดูผลของการปิดใช้งานวินัยสาย TTY โดยการออกstty raw -echo(โปรดทราบว่าพรอมต์ทุบตีหรือโปรแกรมการโต้ตอบอื่น ๆ เช่นการviตั้งสถานีในโหมดที่แน่นอนที่พวกเขาต้องการเพื่อให้คุณต้องการที่จะใช้โปรแกรมใบ้ชอบcatที่จะได้สัมผัสกับที่) จากนั้นทุกอย่างที่เขียนไปยังอุปกรณ์เทอร์มินัลทาสจะทำให้มันไปยังฝั่งมาสเตอร์ทันทีเพื่อให้ xterm อ่านและอักขระทุกตัวที่เขียนโดย xterm ไปยังฝั่งมาสเตอร์จะพร้อมใช้งานสำหรับการอ่านจากอุปกรณ์ทาสทันที

วินัยในการใช้สายคือที่ที่จะใช้เครื่องมือแก้ไขภายในอุปกรณ์เทอร์มินัล ตัวอย่างเช่นด้วยstty icanon echo(ตามค่าเริ่มต้น) เมื่อคุณพิมพ์axterm เขียนaไปยังต้นแบบจากนั้นเส้นบรรทัดจะสะท้อนกลับมา (ทำให้aพร้อมใช้งานสำหรับการอ่านxtermสำหรับการแสดงผล) แต่ไม่ทำให้สิ่งใดสามารถอ่านได้บนด้านทาส . แล้วถ้าคุณพิมพ์ Backspace, xterm ส่ง^?หรือ^Hตัวอักษรวินัยบรรทัด (ที่ว่า^?หรือ^Hสอดคล้องกับeraseการตั้งค่าเส้นวินัย) ส่งกลับในต้นแบบ^H, spaceและ^Hสำหรับxtermเพื่อลบaคุณเพิ่งพิมพ์บนหน้าจอและยังไม่ส่งสิ่งใด ๆ ไปยังแอปพลิเคชันที่อ่านจากด้านทาสเพียงแค่อัปเดตบัฟเฟอร์ตัวแก้ไขบรรทัดภายในเพื่อลบสิ่งที่aคุณพิมพ์ก่อนหน้านี้

จากนั้นเมื่อคุณกด Enter xterm จะส่ง^M(CR) ซึ่งระเบียบวินัยของบรรทัดจะแปลงค่าอินพุตให้เป็น ^ J (LF) และส่งสิ่งที่คุณป้อนจนถึงตอนนี้เพื่ออ่านบนด้านทาส (แอปพลิเคชันที่อ่าน/dev/pts/xจะได้รับอะไร คุณได้พิมพ์รวมถึง LF แต่ไม่ใช่aตั้งแต่ที่คุณลบไป) ในขณะที่ในด้านต้นแบบมันจะส่ง CR และ LF เพื่อเลื่อนเคอร์เซอร์ไปที่บรรทัดถัดไปและจุดเริ่มต้นของหน้าจอ

ระเบียบวินัยของสายยังมีหน้าที่ในการส่งSIGINTสัญญาณไปยังกลุ่มกระบวนการพื้นหน้าของเทอร์มินัลเมื่อได้รับ^Cตัวละครในฝั่งมาสเตอร์เป็นต้น

หลายโปรแกรมขั้วโต้ตอบปิดการใช้งานส่วนใหญ่ของคุณสมบัติของสายที่มีระเบียบวินัยในการดำเนินการด้วยตัวเอง แต่ในกรณีใด ๆ จงระวังว่าเทอร์มินัล ( xterm) มีส่วนร่วมในเรื่องนั้นเล็กน้อย (ยกเว้นการแสดงสิ่งที่บอกให้แสดง)

และสามารถมีได้เพียงหนึ่งเซสชันต่อกระบวนการและต่ออุปกรณ์ปลายทางเท่านั้น เซสชันสามารถมีเทอร์มินัลการควบคุมแนบอยู่ แต่ไม่จำเป็นต้อง (เซสชันทั้งหมดเริ่มต้นโดยไม่มีเทอร์มินัลจนกว่าจะเปิดขึ้นมาหนึ่งเครื่อง) xtermในกระบวนการที่จะเรียกใช้งานเชลล์ของคุณโดยทั่วไปจะสร้างเซสชันใหม่ (และแยกออกจากเทอร์มินัลที่คุณเปิดใช้งานxtermถ้ามี) ให้เปิดใหม่ที่/dev/pts/xมีการวางไข่โดยแนบอุปกรณ์เทอร์มินัลนั้นเข้ากับเซสชันใหม่ จากนั้นจะรันเชลล์ของคุณในกระบวนการนั้นดังนั้นเชลล์ของคุณจะกลายเป็นผู้นำเซสชัน เชลล์หรือเชลล์แบบโต้ตอบใด ๆ ในเซสชันนั้นโดยทั่วไปจะเล่นกับกลุ่มกระบวนการและtcsetpgrp()เพื่อตั้งค่างานพื้นหน้าและเบื้องหลังสำหรับเทอร์มินัลนั้น

ในส่วนของข้อมูลเทอร์มินัลจะถูกเก็บไว้โดยอุปกรณ์ปลายทางที่มีระเบียบวินัย tty (อนุกรมหรือ pty)นั่นคือสิ่งที่sttyคำสั่งจะแสดงและแก้ไข การกำหนดค่าวินัยทั้งหมด: ขนาดหน้าจอเทอร์มินัลท้องถิ่นแฟล็กเอาท์พุทอินพุตการตั้งค่าสำหรับอักขระพิเศษ (เช่น ^ C, ^ Z ... ) ความเร็วอินพุตและเอาต์พุต (ไม่เกี่ยวข้องกับ ptys) ที่สอดคล้องกับtcgetattr()/ tcsetattr()หน้าที่ซึ่งบน Linux แม็พกับTCGETS/ TCSETSioctls และTIOCGWINSZ/ TIOCSWINSZสำหรับขนาดหน้าจอ คุณอาจยืนยันว่ากลุ่มกระบวนการพื้นหน้าปัจจุบันเป็นข้อมูลอื่นที่เก็บไว้ในอุปกรณ์ปลายทาง ( tcsetpgrp()/ tcgetpgrp(), TIOC{G,S}PGRPioctls) หรือบัฟเฟอร์อินพุตหรือเอาต์พุตปัจจุบัน

โปรดทราบว่าข้อมูลขนาดหน้าจอที่เก็บไว้ในอุปกรณ์ปลายทางอาจไม่สะท้อนความเป็นจริง โดยทั่วไปเทอร์มินัลอีมูเลเตอร์จะตั้งค่า (ผ่าน ioctl เดียวกันกับขนาดหลัก) เมื่อปรับขนาดหน้าต่าง แต่สามารถหลุดจากการซิงค์ได้หากแอปพลิเคชันเรียก ioctl ที่ด้านทาสหรือเมื่อไม่ได้ส่งการปรับขนาด (ในกรณี ของการเชื่อมต่อ ssh ซึ่งหมายถึง pty อื่นที่เกิดจากsshdหากsshละเว้นSIGWINCHตัวอย่าง) เทอร์มินัลบางตัวยังสามารถสอบถามขนาดของพวกเขาผ่านทางลำดับ escape ดังนั้นแอปพลิเคชันสามารถสืบค้นด้วยวิธีนั้นและอัพเดตระเบียบวินัยของบรรทัดด้วยข้อมูลนั้น

สำหรับรายละเอียดเพิ่มเติมคุณสามารถดูtermiosและtty_ioctlหน้า man บน Debian ได้

หากต้องการเล่นกับสายงานอื่น:

  1. เลียนแบบเมาส์ด้วยเทอร์มินัลหลอก:

    socat pty,link=mouse fifo:fifo
    sudo inputattach -msc mouse # sets the MOUSE line discipline and specifies protocol
    xinput list # see the new mouse there
    exec 3<> fifo
    printf '\207\12\0' >&3 # moves the cursor 10 pixels to the right
    

    ด้านบนด้านต้นแบบของ pty ถูกยกเลิกโดย socat ไปยัง pipe ที่มีชื่อ ( fifo) เราเชื่อมโยง FIFO ที่กระบวนการ (เปลือก) ที่เขียน 0x87 0x00 0x0A no button pressed, delta(x,y) = (10,0)ซึ่งในระบบเมาส์โปรโตคอลหมายถึง ที่นี่เรา (เปลือก) ไม่ได้เลียนแบบเทอร์มินัล แต่เมาส์ 3 ไบต์ที่เราส่งไม่สามารถอ่านได้ (เปลี่ยนรูป) โดยแอปพลิเคชันจากอุปกรณ์เทอร์มินัล ( mouseด้านบนซึ่งเป็น symlink ของอุปกรณ์socatบาง/dev/pts/xตัว) แต่ต้องตีความว่าเป็นเหตุการณ์อินพุตของเมาส์

  2. สร้างอินเตอร์เฟส SLIP:

    # on hostA
    socat tcp-listen:12345,reuseaddr pty,link=interface
    # after connection from hostB:
    sudo ldattach SLIP interface
    ifconfig -a # see the new interface there
    sudo ifconfig sl0 192.168.123.1/24
    
    # on hostB
    socat -v -x pty,link=interface tcp:hostA:12345
    sudo ldattach SLIP interface
    sudo ifconfig sl0 192.168.123.2/24
    ping 192.168.123.1 # see the packets on socat output
    

    ด้านบนสายอนุกรมถูกจำลองโดยsocatเป็นซ็อกเก็ต TCP ระหว่าง hostA และ hostB ระเบียบวินัยของไลน์ SLIP ตีความว่าไบต์เหล่านั้นแลกเปลี่ยนกันบนบรรทัดเสมือนนั้นเนื่องจาก SLIP ห่อหุ้มแพ็กเก็ต IP สำหรับการจัดส่งบนsl0อินเทอร์เฟซ


1
นี่คือคำตอบที่ดีที่สุด ฉันทำเครื่องหมายว่าถูกต้องและโหวตขึ้น คุณสามารถเพิ่มส่วนสุดท้ายเกี่ยวกับข้อมูลที่ร้านค้า pts ได้หรือไม่ ตามหน้านี้(บทที่กำหนดค่าอุปกรณ์ TTY)ค่า pts จัดเก็บเช่นจำนวนแถวและจำนวนบรรทัด พวกเขามีข้อมูลอื่น ๆ ที่เก็บไว้?
Pierre-Jean

@ Pierre-Jean เพิ่มข้อมูลเพิ่มเติม
Stéphane Chazelas

แม้ว่าคำตอบของคุณจะดีเกินความพึงพอใจ แต่ก็น่าสนใจที่จะเห็นตัวอย่างที่ง่ายกว่าเกี่ยวกับวิธีการสร้าง / dev / pts / M ฉันลองใช้cat /dev/ptmx &ซึ่งจะเปิด pty ใหม่ แต่ไม่มีกระบวนการใดที่ฉันสามารถค้นหาได้เชื่อมโยงกับมันดังนั้นคุณจะใช้มันอย่างไร ประการที่สองฉันลองด้วยecho "1" >/dev/ptmxแต่ก็ไม่ได้ทำอะไรเลย ... ทำไมฉันถึงสนใจ เพราะบ่อยครั้งเมื่อมีการเชื่อมต่อจากระยะไกลผ่านssh(เช่น) คุณจะได้รับPTY allocation request failedหรือNo controlling tty: open /dev/ttyข้อผิดพลาดซึ่งจะช่วยป้องกันการควบคุมงาน มันจะเป็นการดีที่จะเข้าใจสิ่งเหล่านั้นดีขึ้น
not2qubit

@ user1147688 วิธีสร้าง pty จะเป็นคำถามที่แตกต่าง คำถามนี้มีอยู่ครั้งละมากเกินไปแล้ว แต่ดูptyหน้าคนของคุณสำหรับรายละเอียด
Stéphane Chazelas

@ StéphaneChazelasคำอธิบายเล็ก ๆ : 1.งั้นคุณบอกว่าการไหลเหมือนphysical term---- tty---- bashบนเทอร์มินัลและpty(m)---- tty---- pty(s)---- bashบนเทอร์มินัลอีมูเลเตอร์? เป็นttyระเบียบวินัยความรับผิดชอบในการสะท้อนตัวอักษรบนขั้วทางกายภาพเกินไป? 2.โปรแกรม Terminal emulator ที่เชื่อมต่อกับคีย์บอร์ด / หน้าจอเพื่อจัดการอินพุตหรือไม่ 3.ตามสิ่งที่ฉันเข้าใจคุณบอกว่าการบัฟเฟอร์บรรทัดของคำสั่ง bash / อินพุตเทอร์มินัลทั้งหมดทำโดยการttyลงมือปฏิบัติบรรทัดแทนบัฟเฟอร์ I / O ของฟังก์ชัน CI / O ถูกต้องหรือไม่
forumulator

29

แก้ไข: ตั้งแต่คำตอบนี้ฉันเขียนบทความเฉพาะในบล็อกของฉันสำหรับผู้ที่สนใจรายละเอียดเพิ่มเติม


หลังจากอ่านมาเยอะมากนี่คือสิ่งที่ฉันเข้าใจ

  • ptmx มีจุดประสงค์อื่นนอกเหนือจากการจัดสรรส่วนทาสหรือไม่? มันจัดให้มี "ปัญญา" บางชนิดหรือเทอร์มินัลที่จำลอง (เช่น xterm) มีสติปัญญาทั้งหมดของการทำงานเหมือนเทอร์มินัลหรือไม่?

    /dev/ptmxไม่ได้จัดสรรส่วนทาส : มันจะจัดสรร "ส่วนหลักเทอร์มินัลหลอก" / dev / ptmx ไม่ได้เป็นสถานีต้นแบบหลอก : มันเป็นหลอกสถานีต้นแบบ Multiplexer มันถูกสร้างขึ้นด้วยมาตรฐาน Unix98 PTY เพื่อหลีกเลี่ยงสภาพการแข่งขันเมื่อทำการจัดสรรเทอร์มินัลหลอกเทียม ( แหล่งที่มา )

    ส่วนต้นแบบ (PTM)ของอาคารหลอกไม่ได้เป็นตัวแทนในระบบไฟล์ มันถูกแทนด้วยไฟล์ descriptor

    ส่วนทาส (pts)เป็นตัวแทนจากไฟล์ใน/dev/pts/Nที่Nเป็นตัวเลข

    แต้มจะได้รับจาก PTM ผ่านสายต่อเนื่องของgrandpt, unlockpt, ptsname. ( ที่มา )

    ptm แทนที่ไดรเวอร์ AUR โดยเฉพาะเพื่อสื่อสารกับอุปกรณ์และ line line ดังนั้นมันจึงไม่เลียนแบบเทอร์มินัลใด ๆ แต่ให้คุณสมบัติของline editionและให้วิธีการเห็นภาพและสื่อสารกับ pts ( ที่มา )

    นี่คือกราฟของสิ่งที่ TTY เชื่อมต่อกับอุปกรณ์ฮาร์ดแวร์ การสื่อสาร TTY กับ AUR

    และนี่คือกราฟของ tty ที่เชื่อมต่อกับ ptm การสื่อสาร TTY กับ PTM

    ไฟล์ ptm จัดการอาร์กิวเมนต์ Ioctl ที่แตกต่างกัน (ISPTM, UNLKPT, TIOCREMOTE, TIOCSIGNAL) กว่า pts

  • ทำไม xterm จึงต้องโต้ตอบกับชิ้นส่วนหลักเพราะมันจะส่งต่อ stdout และ stdin ของส่วนทาสเท่านั้น เหตุใดจึงไม่สามารถเขียนและอ่านจากไฟล์ pts ได้โดยตรง

    กระบวนการโต้ตอบกับอุปกรณ์ผ่านการดำเนินการกับไฟล์เสมือน (อ่าน, เขียน, ioctl .. ) ไม่มีไฟล์ตัวเองและไดรเวอร์ใช้ไฟล์เพื่อเรียกการกระทำเมื่อมีการเรียกวิธีการอ่านหรือเขียน (ดูภาคผนวกสำหรับข้อมูลเกี่ยวกับไดรเวอร์)

    TTY กำหนดวิธีที่แม่นยำในการโต้ตอบกับมัน กระบวนการเขียนและอ่านจากอุปกรณ์และคาดว่าพฤติกรรมเดียวกันโดยไม่คำนึงถึงชนิดของ TTY จะถูกนำมาใช้

    • ฟังก์ชั่น readถูกใช้โดยกระบวนการเพื่ออ่านรายการจากเทอร์มินัล
    • ฟังก์ชั่นการเขียนถูกใช้โดยกระบวนการเพื่อส่งออกไปยังเทอร์มินัล

    pts ทำตัวเหมือนไดรเวอร์ TTY วิธีการอ่านและเขียนของมันถูกใช้เพื่อนำไปใช้กับพฤติกรรม TTY Driver เนื่องจากไม่มีอุปกรณ์จริงที่จะส่งข้อมูลจึงมีการสร้างคู่สตรีมและ ptm ใช้ฟังก์ชั่นการอ่านเพื่ออ่านข้อมูลที่ส่งโดย pts ไปยังสตรีมและฟังก์ชั่นเขียนเพื่อส่งข้อมูลไปยังสตรีมที่จะใช้งานได้ เมื่อ pts จะอ่านมัน

    โปรดจำไว้ว่าไฟล์ที่แสดงอุปกรณ์ไม่ใช่ไฟล์แบบคลาสสิกและหากxtermต้องการดูสิ่งที่เขียนไปยังไฟล์มันไม่สามารถเรียกเพียงแค่เปิดและอ่านได้เพราะฟังก์ชั่นเหล่านี้มีพฤติกรรมที่แตกต่างกันโดยสิ้นเชิง

  • มี ID เซสชันที่แนบมากับไฟล์ pts หนึ่งไฟล์และกลับกันหรือไม่ ฉันสามารถพิมพ์คำสั่ง ps และพบ 2 sessionId สำหรับ / dev / pts / X เดียวกันได้หรือไม่

    ฉันไม่คิดอย่างนั้นรหัสเซสชันถูกกำหนดโดยกระบวนการแรกที่แนบ pts (โดยทั่วไปแล้วทุบตี) และฉันไม่เห็นวิธีสร้างเซสชันอื่นและแนบกับ pts เดียวกัน อาจเป็นเครื่องมือที่socatสามารถทำได้

  • pts เก็บข้อมูลอื่น ๆ อะไรอีก? Xterm อัปเดตทุกฟิลด์ด้วยตนเองหรือไม่หรือ ptm จะเพิ่ม "ความเฉลียวฉลาด" ลงบนมันหรือไม่?

    เก็บแต้ม 2 ประเภทของข้อมูลเกี่ยวกับสถานีก็มีการติดต่อสื่อสารกับที่: และTerminfo Termcapโดยทั่วไปแล้วเทอร์มินัลอีมูเลเตอร์จำนวนมากขึ้นอยู่กับไลบรารีที่จัดการข้อมูล termcap สำหรับพวกเขา (ซึ่งจะให้ค่าความสามารถทั้งหมดเพื่อจำลอง VTX100 เป็นต้น) กันตัวอย่างของห้องสมุดดังกล่าวเป็นlibvte แก้ไข (ดูความคิดเห็น Chazelas ของ Stephane): ความสามารถของเทอร์มินัลจะไม่ถูกจัดเก็บโดย pts

ภาคผนวก


termcap และ terminfo เป็นฐานข้อมูลเกี่ยวกับความสามารถของเทอร์มินัลหรือเทอร์มินัลอีมูเลเตอร์พวกเขาไม่มีส่วนเกี่ยวข้องกับอุปกรณ์ tty หรือ pty
Stéphane Chazelas

ตกลงฉันจะแก้ไขคำตอบของฉัน ขอบคุณสำหรับความคิดเห็น คุณสามารถเพิ่มข้อมูลนี้เกี่ยวกับ pts ในคำตอบของคุณได้หรือไม่ (เช่นว่า pts จัดเก็บขนาดหน้าจอเป็นต้น)
Pierre-Jean

6
เหล่านี้เป็นภาพที่ดี คุณใช้ซอฟต์แวร์อะไรในการสร้าง
Gilles

5
@Gilles ขอบคุณ ฉันทำด้วยInkscapeโปรแกรมแก้ไขกราฟิกแบบเวกเตอร์โอเพนซอร์ซ อาจไม่ใช่วิธีที่มีประสิทธิภาพที่สุดในการทำกราฟิกประเภทนี้ แต่ถ้าคุณสนใจฉันเขียนบทความเกี่ยวกับวิธีสร้างภาพวาดสามมิติแบบนี้
Pierre-Jean

ฉันไม่คิดว่าคุณสามารถเชื่อมต่อสองเซสชันเข้ากับเทอร์มินัลการควบคุมหรือปล่อยให้หนึ่งครั้งมีเทอร์มินัลการควบคุมมากกว่าหนึ่ง
炸鱼薯条德里克

9

นี่คือรูปแบบที่ฉันทำไว้เมื่อครู่ก่อนเกี่ยวกับวิธีการsshdทำงาน มันไม่เกี่ยวกับการทำงานของวินัยและสิ่งของ แต่มันเพิ่มภาพประกอบชีวิตจริงของผู้ที่โต้ตอบกับอะไร:

ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณมากสำหรับเรื่องนี้. ฉันใช้เวลา 2 วันพยายามที่จะคิดออก ฉันแค่สงสัยว่าจะเกิดอะไรขึ้นเมื่อไม่มีการยกตัวอย่าง pty stdin ไม่มีอยู่แล้วใช้ได้ แต่ stdout และ stderr เขียนไว้ที่ไหน
เพื่อนน้อย

@emmasculateur ดีใจที่ได้ช่วยคุณ ขออภัยฉันไม่เข้าใจสิ่งที่คุณหมายถึงโดย "เมื่อไม่มีการยกตัวอย่าง pty" คุณสามารถยกตัวอย่างเมื่อ pty ไม่สร้างอินสแตนซ์ได้หรือไม่?
Boris Burkov

1
โดย "ไม่มี pty คืออินสแตนซ์" ฉันหมายถึงเมื่อคุณเรียกใช้ ssh ด้วย-Tซึ่งชายคนนั้นบอกว่ามันปิดการจัดสรรเทอร์มินัลหลอก เช่น: ssh -T emasculateur@localhost "sleep 10" จากนั้น ps aux|grep sleepแสดงสิ่งนี้: emasculateur 21826 0.0 0.0 23032 3728 ? Ss 02:49 0:00 zsh -c sleep 10 ในกรณีที่ bash write stdoutและstderr? ฉันหวังว่าคำถามของฉันจะสมเหตุสมผล
เพื่อนน้อย

@emmasculateur อืมมันเป็นคำถามที่ดีเหมาะสมแล้วฉันไม่เคยคิดมาก่อนเลย ฉันเดาว่าเป็นวิธีที่คุณเริ่มกระบวนการของคุณเป็น daemon บนเครื่องระยะไกลโดยไม่ต้องเชื่อมต่อเทอร์มินัล ฉันเดาว่ามันเป็นอินพุต / เอาท์พุต / ข้อผิดพลาดมาตรฐานเพียงไป/dev/nullชอบภูตธรรมดา แต่ไม่แน่ใจ ดูเพิ่มเติม: serverfault.com/questions/593399/…
Boris Burkov

@emmasculateur ฉันยังพบกรณีอื่นจากคุณ: หากกระบวนการของคุณเคยมีเทอร์มินัล แต่เทอร์มินัลนั้นปิดกระบวนการจะได้รับ SIGHUP จากเคอร์เนลเมื่อพยายามอ่าน / เขียนเพื่อ stdout / stdin นี้มักจะฆ่างานที่เริ่มต้นผ่าน SSH โดยไม่ต้องnohupหรือ/screen tmux
Boris Burkov

0

man pts พูดว่า:

ไฟล์ / dev / ptmx เป็นไฟล์อักขระที่มีหมายเลขหลัก 5 และหมายเลขรอง 2 ซึ่งโดยปกติคือโหมด 0666 และ owner.group ของ root.root มันถูกใช้เพื่อสร้างหลักปลอมและคู่เทอร์มินัล

เมื่อกระบวนการเปิด / dev / ptmx มันจะได้รับไฟล์ descriptor สำหรับ pseudo- terminal master (PTM) และอุปกรณ์ pseudo-terminal slave (PTS) ถูกสร้างขึ้นในไดเรกทอรี / dev / pts ไฟล์ descriptor แต่ละไฟล์ที่ได้รับจาก open / dev / ptmx เป็น PTM อิสระที่มี PTS ที่เกี่ยวข้องซึ่งสามารถหาพา ธ ได้โดยส่ง descriptor ไปยัง ptsname (3)

ก่อนที่จะเปิดตัวหลอกหลอกเทอร์มินัลคุณต้องผ่านตัวอธิบายไฟล์ของมาสเตอร์เพื่อให้สิทธิ์ (3) และปลดล็อค (3)

เมื่อทั้งต้นแบบหลอกและเทอร์มินัลเปิดทาสสเลฟจะจัดเตรียมกระบวนการด้วยอินเตอร์เฟสที่เหมือนกับของเทอร์มินัลจริง

ข้อมูลที่เขียนไปยังสลาฟจะถูกนำเสนอบนตัวบ่งชี้หลักเป็นอินพุต ข้อมูลที่เขียนไปยังต้นแบบจะถูกนำเสนอต่อทาสในฐานะอินพุต

ในทางปฏิบัติแล้วเทอร์มินัลหลอกใช้สำหรับการติดตั้งเทอร์มินัลอีมูเลเตอร์เช่น xterm (1) ซึ่งข้อมูลที่อ่านจากตัวหลักเทอร์มินัลเทียมหลอกถูกตีความโดยแอปพลิเคชันเช่นเดียวกับเทอร์มินัลจริง โปรแกรม -login เช่น sshd (8) ซึ่งข้อมูลที่อ่านจากต้นแบบหลอกเทอร์มินัลถูกส่งข้ามเครือข่ายไปยังโปรแกรมไคลเอนต์ที่เชื่อมต่อกับเทอร์มินัลหรือเทอร์มินัลอีมูเลเตอร์

Pseudo-terminal ยังสามารถใช้เพื่อส่งอินพุตไปยังโปรแกรมที่ปกติปฏิเสธที่จะอ่านอินพุตจากไพพ์ (เช่น su (8) และ passwd (8))

เกี่ยวกับ/dev/pts/X indexing:

แต่ละ X คือเซสชันที่คุณเปิดดังนั้นทาสจำเป็นต้องสร้างดัชนี

เกี่ยวกับTeteType (/dev/ttyN):

sysVมันคอนโซลจริงได้รับการสร้างโดยระบบบูตของคุณเช่น

เกี่ยวกับสาเหตุที่ทาสของอาจารย์ติดอยู่: http://commons.wikimedia.org/wiki/File:Termios-script-diagram.png


ฉันขอโทษ แต่คุณไม่ได้ตอบคำถาม ฉันอ่าน man page แล้วและดูกราฟนี้ แต่พฤติกรรมไม่ชัดเจน คุณสามารถเพิ่มการตอบสนองตามคำถามได้หรือไม่
Pierre-Jean


ในการใช้ระบบย่อย pseudo-TTY ต้องติดตั้งโหนดสำหรับไดรฟ์เวอร์หลัก / dev / ptmx และ N จำนวนของไดร์เวอร์สลาฟ (N ถูกกำหนดเมื่อทำการติดตั้ง) ชื่อของอุปกรณ์สลาฟคือ / dev / pts / M โดยที่ M มีค่า 0 ถึง N-1 ผู้ใช้เข้าถึงอุปกรณ์หลอก -TTY ผ่านอุปกรณ์หลัก (เรียกว่า ptm) ซึ่งจะสามารถเข้าถึงได้ผ่านทางไดรเวอร์โคลนอุปกรณ์หลักถูกตั้งค่าเป็นอุปกรณ์โคลนที่หมายเลขอุปกรณ์หลักเป็นอุปกรณ์หลักสำหรับอุปกรณ์โคลนและอุปกรณ์ หมายเลขอุปกรณ์รองเป็นสิ่งสำคัญสำหรับไดรเวอร์ ptm
PersianGulf

ใช่ฉันอ่าน man pan page .... !
PersianGulf

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