ฉันจะขอเกี่ยวกับเอาต์พุตของเทอร์มินัลหนึ่งจากเทอร์มินัลอื่นได้อย่างไร


44

ฉันต้องการเชื่อมต่อกับเอาต์พุตของเทอร์มินัลที่กำลังทำงานอยู่ (tty1) จากเทอร์มินัลเสมือนและจับมัน (ใช้งานเซิร์ฟเวอร์ X)


5
ในขณะที่ฉันเข้าใจว่าบางครั้งความต้องการที่เกิดขึ้นในการจับเนื้อหาบน tty อื่นหลังจากที่คำสั่งกำลังทำงานอยู่การป้องกันออนซ์มีค่าหนึ่งปอนด์การรักษาดังนั้นให้พิจารณาการเริ่มต้นใช้งานscreenหรือtmuxก่อนที่จะเริ่มคำสั่งที่คุณอาจต้องการเข้าถึงจากเทอร์มินัลอื่น .
ลง

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

คำตอบ:


23

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

แต่มันใช้งานได้!

ตัวอย่างเช่น

ssh แรกลงในกล่องของคุณในระยะ # 1:

TERM#1% ssh saml@grinchy

หมายเหตุ tty ของเทอร์มินัลใหม่นี้:

TERM#1% tty
/dev/pts/3

ในเทอร์มินัลอื่น (TERM # 2) ให้เรียกใช้คำสั่งนี้:

TERM#2% ttylog pts/3
DEBUG: Scanning for psuedo terminal pts/3
DEBUG: Psuedo terminal [pts/3] found.
DEBUG: Found parent sshd pid [13789] for user [saml]

ตอนนี้กลับไปที่ TERM # 1 แล้วพิมพ์สิ่งต่างๆมันจะแสดงใน TERM # 2

เอสเอสของขั้ว

คำสั่งทั้งหมดที่ฉันพยายาม (บน, LS, ฯลฯ ) ttylogทำงานโดยไม่เกิดขึ้นโดยใช้


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

ใช่มันgdbเป็นตัวเลือกแรกที่ฉันเจอฉันเคยใช้มันมาก่อน แต่มันก็เป็นเรื่องแฮ็ค ดีใจที่ได้ช่วยคุณออก!
slm

1
ttylog ดูเหมือนจะไม่สามารถแนบกับกระบวนการที่ถูกต้องได้ - ทุกคนสามารถตอบคำถามของฉัน: serverfault.com/questions/560972/…
LittleBobbyTables

21

แน่นอนมันเป็น อุปกรณ์ / dev / vcs * และ / dev / vcsa * สอดคล้องกับอุปกรณ์ / dev / tty * (เทอร์มินัลเสมือน) F1 = tty1 = vcs1 / vcsa1 เป็นต้น vcs / vcsa เปรียบเสมือน tty สำหรับเทอร์มินัลเสมือน "ปัจจุบัน"

ในฐานะที่เป็น root คุณสามารถใช้อุปกรณ์เหล่านี้ (เช่น cat / dev / vcs2) และดูว่ามีอะไรอยู่ใน VT ที่เกี่ยวข้อง (เช่น / dev / tty2 บน on F2) เช่นถ่ายภาพ vcsa * แตกต่างจาก vcs * ซึ่งรวมข้อมูลเกี่ยวกับขนาดของเครื่อง (หน้าจอ) โปรดทราบว่ามันเป็นเพียงแค่ภาพรวมของตัวละครตามที่ปรากฏบนหน้าจอ - รวบรวมจากหน่วยความจำที่จัดสรรให้กับเครื่องเทอร์มินัล - ดังนั้นอย่าคาดหวังว่าจะได้ผลลัพธ์ที่ดี

ข้อเสียเปรียบคือถ้าข้อมูลที่ผ่านมาเร็วเกินไปอาจเป็นเรื่องยากที่จะจับ บางที tail -f / dev / vcs1 อาจใช้งานได้หากคุณต้องการติดตามหลาย ๆ หน้าจอ (ยังไม่ได้ลองเลย) อาจเป็นการง่ายที่สุดในการเปลี่ยนเส้นทางไปยังไฟล์ก่อน มันอาจเป็นความคิดที่ดีที่จะใช้ VT (F1-F6) เพื่อดูมันเนื่องจากเทอร์มินัลจะมีขนาดเท่ากัน จากประสบการณ์ของฉันควรใช้อุปกรณ์ vcs * ไม่ใช่อุปกรณ์ vcsa *

หากไม่ได้ผลอาจเป็นหนึ่งในแพ็คเกจ "พี่ใหญ่" ที่อนุญาตให้ผู้ดูแลระบบคอยดูกิจกรรมบนเทอร์มินัล

PS: ฉันลืมถามระบบปฏิบัติการที่คุณใช้ สิ่งนี้มีไว้สำหรับ Linux แม้ว่าอุปกรณ์ที่คล้ายคลึงกันอาจมีอยู่ในระบบปฏิบัติการอื่นเช่นกัน ลองค้นหา "หน่วยความจำเสมือนคอนโซล" จากอุปกรณ์พกพา


มีวิธีใดในการฉีดอินพุตลงใน tty1 จาก ssh? ตัวอย่างเช่นฉันต้องทำงานกับ raspberry pi ที่เรียกใช้ Debian แต่ปัญหาคือมันมีพอร์ต usb เพียงพอร์ตเดียวมันถูกยึดโดยอะแดปเตอร์ไร้สายและดังนั้นฉันจึงไม่สามารถต่อแป้นพิมพ์เพื่อใช้ tty1 ได้ เนื่องจากฉันต้องเรียกใช้สคริปต์ที่ในระหว่างกระบวนการดำเนินการปิดตัวลงwlan0ฉันจึงมีสถานการณ์ catch-22 ที่พยายามดีบักตำแหน่งที่สคริปต์นี้ล้มเหลว สมมติว่าฉันไม่สามารถใช้ฮับ usb ได้ ... มีวิธีใดบ้างที่ฉันจะใช้งาน chars ลงใน / dev / tty1
Steven Lu

2
ดี. ฉันสามารถไปป์ไลน์ให้/dev/tty1เป็นรูทได้ แต่ทั้งหมดนี้จะแสดงตัวละครบนหน้าจอไม่ใช่ป้อนพวกเขา
Steven Lu

1
ขออภัยหากนี่เป็นเพียงเสียงรบกวน มันไม่เกี่ยวข้องกัน 100% แต่ฉันตอบคำถามของฉันในความคิดเห็นข้างต้นด้วยสิ่งนี้
Steven Lu

18

ดูที่:

man 1 script

ตัวอย่างเช่น:

script -f /dev/tty1

ฉันกำลังมองหาสิ่งนี้ พยายามที่จะแนบโดยscreenล้มเหลวอย่างน่าสังเวช มันได้ผล.
sdkks

5

ใช้ttyคำสั่งในแต่ละเทอร์มินัลเพื่อระบุ:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

สมมติว่า TTY เหล่านี้เพื่อเปลี่ยนเส้นทาง stdout แรกไปเป็นวินาทีให้รันสิ่งนี้ในเทอร์มินัลแรก:

exec 1>/dev/pts/1

หมายเหตุ: ตอนนี้เอาต์พุตคำสั่งทุกรายการจะแสดงบน pts / 1

ในการกู้คืนพฤติกรรมเริ่มต้น stdout ของ pts / 0:

exec 1>/dev/pts/0

ดูวิดีโอนี้สำหรับการสาธิต


2

สิ่งนี้ใช้ได้กับฉัน:

  • การใช้แป้นพิมพ์บนคอมพิวเตอร์ "A" (เช่นคอมพิวเตอร์จริงที่ต้องควบคุม) ให้เรียกใช้: screen -q

  • เชื่อมต่อกับsshจากคอมพิวเตอร์ "B" กับคอมพิวเตอร์ "A"

  • ในเซสชัน ssh ให้พิมพ์: screen -lsเพื่อรับรหัสเซสชันเพื่อเชื่อมต่อกับ (4 หลักในแถวที่มีtty )

  • เชื่อมต่อกับเซสชันด้านบนด้วย: screen -x <session id>... โดยใช้หมายเลขรหัสเซสชันที่ได้รับจากscreen -lsคำสั่งด้านบน

สิ่งใดก็ตามที่พิมพ์ใน "เซสชัน" จะเกิดขึ้นในทั้ง "เซสชัน" ดังนั้นตัวอย่างเช่นการพิมพ์screen -dจะออกจากทั้งสองเซสชัน


1

อีกวิธีหนึ่งคือการใช้screenยูทิลิตีgnu ในเครื่องท้องถิ่นของคุณ เรียกใช้ด้วย-Lตัวเลือกหรือเริ่มโดยไม่มีตัวเลือกนั้นและใช้^aHลำดับคำสั่ง ทั้งสองวิธีทำให้อินพุตและเอาต์พุตทั้งหมดถูกบันทึกลงในไฟล์ที่ชื่อscreenlog.xโดยที่ x คือหมายเลขหน้าจอ

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


1

เนื่องจากฉันไม่ได้เริ่ม tty1 ด้วยหน้าจอสคริปต์นี้จึงช่วย:

ฉันใช้คำตอบจาก Baard Kopperud ด้านบน "128" คือ 1 บรรทัดของ tty1 ของฉัน สลีปสามารถตั้งค่าเป็นหมายเลขที่เหมาะสม

#!/bin/bash
while true
do
    sudo tail -c 128 /dev/vcs1 && echo ""
    sleep 10
done

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


ขอบคุณสำหรับแนวคิดบน rasperry ฉันต้องทำ '' 'ดู cat / dev / vcs' '' เพื่อดูกระบวนการที่ฉันเริ่มบนคอนโซลเสมือนที่ลืมเกี่ยวกับการใช้ 'หน้าจอ' และฉันเพิ่งปรับ gnome-terminal ของฉันฉันวิ่งนี่เป็น 80 ตัวกว้าง
axkibe

0

เปิดสองเทอร์มินัล พิมพ์ttyแต่ละรายการและคุณจะได้รับรหัสเป็น/dev/pts/nº

จากนั้นในครั้งแรกที่คุณพิมพ์script -f /dev/pts/nºofSecondTerminalและในวินาทีที่คุณทำตรงข้ามscript -f /dev/pts/nºofFirstTerminalเพื่อให้พวกเขาได้รับการเชื่อมโยง

ยินดีด้วย! เทอร์มินัลทั้งเอาท์พุทและรับสิ่งเดียวกัน ต้องการที่สาม คุณได้ศึกษาชุดค่าผสมแล้วหรือยัง? คุณจะต้องมี 6 script -fคำสั่ง tty มากยิ่งขึ้น? ต่อไป ...

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