สิ่งที่เก็บอยู่ในไฟล์ / dev / pts และเราสามารถเปิดมันได้?


73

ตามความรู้ของฉัน/dev/ptsไฟล์จะถูกสร้างขึ้นสำหรับช่วง ssh หรือ telnet


6
echo Hello > /dev/pts/1... ดูว่าเกิดอะไรขึ้นมันคือเครื่องของคุณ
Sepahrad Salour


1
@SepahradSalour มีการปรับหมายเลข pts ให้สอดคล้องกับบริบท sshd ของฉันได้ใช้ / dev / pts / 30 สำหรับเซสชั่นของฉัน
Gab 是好人

2
@Gab是好人ttyเพื่อให้ได้สถานที่ตั้งของสถานีในปัจจุบันของคุณคุณสามารถใช้คำสั่ง
JeromeJ

คำตอบ:


110

/dev/ptsไม่มีอะไรที่ถูกเก็บไว้ใน ระบบไฟล์นี้ใช้งานได้จริงในหน่วยความจำ

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

เทอร์มินัลสามารถเป็นเทอร์มินัลฮาร์ดแวร์ (“ tty”, สั้นสำหรับ“ teletype”) หรือเทอร์มินัลหลอก (“ pty”) เทอร์มินัลฮาร์ดแวร์เชื่อมต่อผ่านอินเทอร์เฟซบางอย่างเช่นพอร์ตอนุกรม ( ttyS0, ... ) หรือ USB ( ttyUSB0, …) หรือผ่านหน้าจอพีซีและคีย์บอร์ด ( tty1, ... ) เทอร์มินัลเทียมหลอกนั้นจัดทำโดยตัวจำลองเทอร์มินัลซึ่งเป็นแอปพลิเคชัน เทอร์มินัลหลอกบางชนิด ได้แก่ :

  • แอปพลิเคชั่น GUI เช่น xterm, gnome-terminal, konsole, ... เปลี่ยนเหตุการณ์คีย์บอร์ดและเมาส์ให้เป็นข้อความและการแสดงผลกราฟิกในรูปแบบอักษรบางแบบ
  • แอพพลิเคชั่น Multiplexer เช่นหน้าจอและ tmux รีเลย์อินพุตและเอาต์พุตจากและไปยังเทอร์มินัลอื่นเพื่อแยกการใช้งานแอพพลิเคชั่นโหมดข้อความจากเทอร์มินัลจริง
  • รีโมตแอ็พพลิเคชันเชลล์เช่น sshd, telnetd, rlogind, …รีเลย์อินพุตและเอาต์พุตระหว่างรีโมตเทอร์มินัลบนไคลเอ็นต์และ pty บนเซิร์ฟเวอร์

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

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

ในการทดลองใช้งานttyในเทอร์มินัลเพื่อดูว่าอุปกรณ์เทอร์มินัล /dev/pts/42สมมติว่ามันเป็น ในเชลล์ในเทอร์มินัลอื่นให้รันecho hello >/dev/pts/42: สตริงhelloจะปรากฏขึ้นที่เทอร์มินัลอื่น ตอนนี้รันcat /dev/pts/42และพิมพ์ในเทอร์มินัลอื่น การฆ่าว่าcatคำสั่ง (ซึ่งจะทำให้สถานีอื่น ๆ ยากที่จะใช้) กด+CtrlC

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


ฉันอาจเข้าใจผิดในสิ่งที่คุณพยายามจะพูดหรือข้อมูลของคุณไม่ถูกต้อง กระบวนการเบื้องหลังที่เขียนไปยังเทอร์มินัลจะไม่ส่งผลให้ SIGTTIN และไม่สามารถอ่านหลายโปรแกรมจากเทอร์มินัลได้ในเวลาเดียวกัน (ข้อความของคุณที่ว่า "อักขระแต่ละตัวถูกกำหนดเส้นทางอย่างอิสระ") มีเพียงหนึ่งโปรแกรมเท่านั้นที่สามารถอ่านจากเทอร์มินัลเมื่อใดก็ได้และความพยายามโดยโปรแกรมแบ็คกราวน์ที่จะอ่านจากเทอร์มินัลนั้นจะส่งผลให้ SIGTTIN นั่นเป็นกรณีเดียวที่ SIGTTIN ถูกส่งโดยอัตโนมัติ
Patrick

นอกจากนี้คุณไม่สามารถอ่านจากเทอร์มินัลอื่นเช่นกัน การทำเช่นนั้นจะเป็นจุดอ่อนด้านความปลอดภัยที่สำคัญเนื่องจากคุณสามารถดักจับข้อมูลได้ คุณสามารถstraceโปรแกรมอ่านอินพุต แต่นั่นคือมัน
Patrick

4
@Patrick พื้นหลังกระบวนการเขียนไปยังสถานีรับ SIGTTOU นั่นคือการพิมพ์ผิด หลายโปรแกรมสามารถอ่านจากเทอร์มินัลในเวลาเดียวกัน (ลองและดูวิธีที่ฉันอธิบายในย่อหน้าถัดไปคุณต้องทำจากกระบวนการที่เทอร์มินัลการควบคุมไม่ใช่เทอร์มินัลนั้น) ใช่คุณสามารถอ่านจากเทอร์มินัลอื่นตราบใดที่มันเป็นของคุณ - ทำไมคุณคิดว่ามันจะเป็นไปไม่ได้?
Gilles

กระบวนการเบื้องหลังที่เขียนไปยังเทอร์มินัลจะได้รับ SIGTTOU เท่านั้นหากtostopตั้งค่าสถานะ tty ธงนี้ไม่ได้ตั้งค่าเริ่มต้น และฉันยืนแก้ไขในการอ่านจาก anoter TTY ฉันลองแล้วมันใช้งานได้ แต่อยู่บนพื้นฐานของการอ่านไม่ใช่พื้นฐานสำหรับตัวละคร (เมื่อนั่งที่ shell prompt พวกมันเหมือนกับ shells อ่าน 1 ตัวอักษรในแต่ละครั้ง) มันอาจเป็นการดีที่จะชี้แจงประเด็นนี้เพราะตอนนี้ฉันตีความคำตอบของคุณแล้ว
Patrick

2
@ แพทริกแน่นอนว่าการreadโทรจะส่งกลับอักขระต่อเนื่องกันเท่านั้น (หรือมากกว่าที่ฉันควรบอก) แต่แอปพลิเคชันไม่สามารถควบคุมจำนวนการreadโทรที่จะส่งกลับได้ดังนั้นจึงไม่ดีกว่า
Gilles

18

ไฟล์ที่อยู่ใน/dev/pts"pseudo-ttys" พวกมันเหมือนไปป์ที่มีชื่อในระดับหนึ่ง แต่พวกเขายังเลียนแบบเทอร์มินัลการเชื่อมต่อแบบอนุกรมเก่าเช่น VT-100 Pseudo-ttys ทำหน้าที่ถ่ายโอนไบต์จากแป้นพิมพ์ไปยังโปรแกรมและจากโปรแกรมไปยังอุปกรณ์ส่งออกซึ่งฟังดูง่าย แต่นั่นเป็นคำตอบสำหรับคำถามอธิบายของคุณ: เคอร์เนลไม่ได้เก็บอะไร/dev/pts/0ไว้ เฉพาะสตรีมของไบต์จาก stdout ของโปรแกรมที่เชื่อมต่อกับ pseudo-tty เท่านั้นที่เข้ามาและโปรแกรมที่ stdin เชื่อมต่อกับ pseudo-tty เดียวกันอ่านไบต์เหล่านั้น

Pseudo-ttys ยังใส่เลเยอร์ของการอ้อมเข้าไปในกระแสของไบต์ เคอร์เนลสามารถตรวจสอบไบต์สำหรับค่าพิเศษเช่น "Control-C" หรือ "Control-D" หรือ "Control-U" (ซึ่งสามารถกำหนดค่าได้ทั้งหมดดูman stty) และส่ง SIGINT ตั้งค่าการสิ้นสุดไฟล์บน stdin หรือลบ บรรทัดบนอินพุต นอกจากนี้ยังมีฟังก์ชั่นบัฟเฟอร์ในบางแห่งดังนั้น "ร้านค้าไม่มีอะไร" ของฉันค่อนข้างผิด แต่เพียงไม่กี่กิโลไบต์

เคอร์เนลสามารถตรวจสอบค่าไบต์บนเอาท์พุทและทำสิ่งต่าง ๆ เช่นเปลี่ยน newline (ASCII linefeed, LF หรือ"\n") เป็นสองไบต์, carriage-return และ linefeed (CRLF หรือ"\r\n") หรือไบต์ใด ๆ ที่ฮาร์ดแวร์เทอร์มินัลอนุกรมต้องการ ทางอ้อมของ pseudo-tty อนุญาตให้เป็นอิสระจากฮาร์ดแวร์

Pseudo-ttys อนุญาต "อัตรา baud", "set parity" และการioctl()เรียกระบบอื่น ๆทั้งหมดและอาจไม่ทำอะไรกับมันเลย สิ่งนี้ช่วยให้โปรแกรมที่ถูกเขียนย้อนกลับไปในวัน VT-100s, ADM-3 และ Wyse whatevers ทำงานต่อไปโดยไม่มีข้อผิดพลาด ซอฟต์แวร์ไดรเวอร์อุปกรณ์ pseudo-ttys ทำหน้าที่เหมือนฮาร์ดแวร์

Pseudo-ttys อาจถูกใช้โดยsshdและtelnet, แต่มันยังถูกใช้ระหว่างเทอร์มินัลอีมูเลเตอร์ (เช่นxtermหรือrxvt) และเชลล์ที่โดยทั่วไปจะทำงานภายใน xterm

Linux และ Unixes จำนวนมากมี pseudo-ttys แผน 9 ไม่ได้ Pseudo-ttys เป็นของที่ระลึกเล็กน้อยเหลือจากวันที่เทอร์มินัลฮาร์ดแวร์ที่เชื่อมต่อด้วยสายเคเบิลอนุกรม


13

/dev/เป็นไดเร็กทอรีพิเศษสำหรับไฟล์อุปกรณ์ สิ่งเหล่านี้คือ abstractions ไม่ใช่ไฟล์จริงบนดิสก์ ไดเรกทอรีที่มีประชากรที่บูตและอาจมีการเปลี่ยนแปลงที่จะสะท้อนให้เห็นถึงการเชื่อมต่ออุปกรณ์ที่มีอยู่ซึ่งถูกสร้างขึ้นและถูกทำลายโดยเคอร์เนลและภูต udevduserspace,

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

คุณสามารถเปิดเป็นไฟล์ได้แม้ว่าจะไม่ได้คุ้มค่ามากนัก ในการรับ/dev/ptsโหนดที่เปลือกของคุณเชื่อมต่อให้ใช้tty:

> tty
/dev/pts/4

ตอนนี้เปลี่ยนไปใช้คอนโซลอื่นแล้วลองทำดังนี้:

> echo "duck!" > /dev/pts/4

ฉลาด. ตอนนี้ลอง:

> cat /dev/pts/4

จากนั้นลองใช้เชลล์ที่ / dev / pts / 4 คุณติดอยู่จนกว่าคุณจะออกจากcatด้านอื่น ๆ แต่สิ่งที่คุณพิมพ์บน pts / 4 ส่วนใหญ่จะผ่าน (เช่นพยายาม "hello world" ฉันสิ้นสุดด้วยhlpts / 4 และello wordบนcatคอนโซล)

ฉันเดาว่านี่คืออุปกรณ์กำลังรับข้อมูลจากเปลือกและส่งออกผ่านระบบซึ่งเป็นสิ่งที่เกิดขึ้นบนหน้าจอ - เปลือกไม่ได้เกี่ยวข้องกับฮาร์ดแวร์ระบบคือ ลองstrace bash(และดูman straceถ้าคุณไม่รู้ว่ามันคืออะไร); คุณจะได้รับความวุ่นวายในเบื้องต้นเมื่อมีการทุบตี ตอนนี้เริ่มกดปุ่ม:

read(0, "h", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "e", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "y", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0

สำหรับตัวอักษรทุกตัวที่พิมพ์จะมีการอ่านจากอินพุตมาตรฐานและการเขียนออกมาตรฐาน แต่มาตรฐานของเชลล์เชื่อมต่อกับอะไร ทีนี้ลองstraceใช้เทอร์มินัล GUI ของคุณคุณจะต้องคิดชื่อถ้าคุณไม่รู้ชื่อเช่นบน KDE konsoleและ GNOME gnome-terminalก็เชื่อ เอาท์พุทจากที่straceน่าจะเป็นความลับมากขึ้น - เหมืองมีจำนวนมากและpoll() recvfrom()ฉันไม่เห็นการเขียนใด ๆ แต่ถ้าคุณดึงcatเคล็ดลับจากเทอร์มินัลอื่นคุณจะสังเกตเห็นเมื่อคุณพิมพ์สโตรกคีย์ที่แมวอ่านได้ทำให้ไม่ตอบสนองเลยใน strace output - เทอร์มินัลไม่ได้ ' ไม่ได้รับพวกเขา ดังนั้นแอปเทอร์มินัล GUI และ cat กำลังแข่งขันกันอ่านจากอุปกรณ์เดียวกันซึ่งเชลล์ส่งออกไป


การใช้งาน 'cat / dev / pts / 4' คืออะไรเมื่อเราติดขัดและทำไมเราถึงติดขัดขณะดำเนินการคำสั่งนี้
user2720323

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