ฉันจะสลับไปมาระหว่าง ttys โดยไม่ใช้หน้าจอได้อย่างไร


17

สมมุติว่าคุณบูทลินุกซ์ติดตั้งไปจนถึงเดสก์ท็อป คุณเริ่มต้น gnome-terminal / konsole / อะไรก็ตามคุณมี tty เพื่อป้อนคำสั่ง

ทีนี้สมมุติว่าฉัน SSH เข้าไปในเครื่องเดียวกัน มันจะผูกมัดฉันกับ tty อื่นเพื่อป้อนคำสั่ง

ตอนนี้สมมติว่าฉันต้องการ "เปลี่ยน" tty ของฉันจาก SSH ดั้งเดิมของฉันเป็น gnome-terminal หนึ่งเริ่มต้นก่อนหน้านี้

โดยทั่วไปฉันถามว่ามีวิธีการทำสิ่งเดียวกันscreen -xแต่ไม่มีหน้าจอ?

ฉันรู้ว่าคุณสามารถส่งออกไปยัง tty อื่น ๆ ได้อย่างง่ายดายเพียงแค่สะท้อนบางสิ่งลงในไฟล์ / dev แต่ฉันไม่รู้วิธีที่จะ 'ดู' สิ่งที่อยู่ใน tty

ความคิดใด ๆ



สิ่งนี้ซ้ำซ้อนกับunix.stackexchange.com/questions/8469/หรือไม่?
mattdm

คำตอบ:


16

บางทีสคีเหล่านี้สามารถชี้แจงสถานการณ์ นี่เป็นการตั้งค่าปกติ:

                               Terminal  (/dev/ttyX or /dev/pts/x)
                                device
                                   |
                    (screen)<--[<output]----x-------(stdout) Process1
        Terminal  (keyboard)---[input >]---o-\----->(stdin)
                                            \ \
(hardware console or                         \ `----(stdout) Process2
 virtual console or terminal                  `---->(stdin)
 emulators like xterm, …)

และไม่มีทางที่จะเสียบใหม่Process3อย่างนี้:

                             Terminal
                              device
                                 |
             (screen)<---o---[<output]--x------(stdout) Process1
  Terminal (keyboard)---/-x--[input >]-o-\---->(stdin)
                       | /              \ \
                       | |               \ `---(stdout) Process2
                       | |                `--->(stdin)
                       | |
                       \ `---------------------(stdout) Process3
                        `--------------------->(stdin)

สิ่งที่หน้าจอ (และอื่น ๆ ) ทำคือการจัดสรรอุปกรณ์เทอร์มินัลหลอกบางอย่าง (เช่น xterm ทำ) และเปลี่ยนเส้นทางไปยังเทอร์มินัล "ของจริง" หนึ่งรายการหรือมากกว่า (ทางกายภาพเสมือนหรือจำลอง)

             Terminal                   pseudo
             devices              ,--> Terminal (/dev/pts/x)
                |         _______/      device
Terminal <--[<output]--- |       |        |
 1       ---[input >]--> |screen | <--[<output]---x-----(stdout) Process1
                         |Process| ---[input >]--o-\--->(stdin)
Terminal <--[<output]--- |       |                \ \
 2       ---[input >]--> |_______|                 \ `--(stdout) Process2
                                                    `-->(stdin)

การใช้screen -xคุณสามารถเชื่อมต่อเทอร์มินัล xterm เพิ่มเติมใด ๆ (พูดTerminal 3) เข้ากับเซสชันของหน้าจอได้

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


นั่นเป็นคำอธิบายที่ดีมาก! ฉันคิดว่ามันไม่ใช่คำตอบจริงๆที่นี่ แต่จะเหมาะกับคำถามนี้ดี การสังเกตหนึ่ง:“ ไม่มีทาง” จะเกิดขึ้นได้ก็ต่อเมื่อคุณห้ามptrace; ขอบคุณที่ptraceโปรแกรมต้องการneercs, rettyและอื่น ๆ สามารถทำมันได้ในบางครั้ง
Gilles 'หยุดความชั่วร้าย'

@Gilles: ดีที่พวกเขาทำอย่างอื่นพวกเขาเปลี่ยนค่าของอธิบายไฟล์ ( stdin, stdoutบนด้านขวาของสกีมา) โดยตรงโดยการหักหลังกระบวนการ ความชั่วร้ายบริสุทธิ์!
Stéphane Gimenez

1
อืมคุณพูดถูกพวกเขาเปลี่ยนลูกศรตัวอื่น ชั่วร้าย แต่สะดวก!
Gilles 'หยุดความชั่วร้าย'

8

การเชื่อมต่อกระบวนการในเทอร์มินัลอื่นเข้ากับเทอร์มินัลปัจจุบันของคุณเป็นไปไม่ได้หากไม่มีเทคนิคสกปรก เป็นไปได้โดยการบังคับให้กระบวนการดำเนินการเรียกระบบบางอย่าง (ด้วยptrace); ทำให้บางโปรแกรมขัดข้อง มีเครื่องมือหลายอย่างที่ทำเช่นนี้เป็นเช่นneercs, retty, cryopid, reptyr, ... ; ดูฉันจะบอกเลิกกระบวนการทำงานและเชื่อมโยงกับเชลล์หน้าจอใหม่ได้อย่างไร และคำถามที่เชื่อมโยง

การรับเอาต์พุตที่แสดงบนเทอร์มินัลอื่นเป็นปัญหาที่แตกต่างกัน ไม่มีวิธีการแก้ปัญหาทั่วไปอย่างสมบูรณ์: โดยหลักการแล้วเมื่อมีการแสดงผลเอาต์พุตเทอร์มินัลอาจเก็บไว้เป็นภาพเท่านั้น ในทางปฏิบัติตัวจำลองเทอร์มินัล X ทั้งหมดเก็บบัฟเฟอร์เอาต์พุตในรูปแบบข้อความเพื่อให้คุณสามารถคัดลอกวาง วิธีการจับเอาท์พุทนั้นขึ้นอยู่กับเทอร์มินัลอีมูเลเตอร์; แนวคิดพื้นฐานคือการจำลองการเลือกบัฟเฟอร์การเลื่อนทั้งหมด สำหรับคอนโซล Linux เช่น/dev/tty1บัฟเฟอร์การเลื่อนนั้นสามารถใช้งานได้ง่าย/dev/vcs1(และ/dev/vcsa1ด้วยคุณลักษณะข้อความ)

คำตอบง่ายๆคือว่าถ้าคุณต้องการที่จะเชื่อมต่อไปยังสถานีจากสถานที่ที่แตกต่างกันการใช้งานหรือscreentmux

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