วิธีส่งเอาต์พุตจากเทอร์มินัลหนึ่งไปยังเทอร์มินัลอื่นโดยไม่ต้องสร้างไพพ์หรือไฟล์ใหม่


26

ฉันแค่หลอกไปรอบ ๆ สถานีของฉัน (สถานี Gnome) ฉันสงสัยว่ามีวิธีส่งเอาต์พุตของเทอร์มินัลหนึ่งไปยังเทอร์มินัลอื่นโดยไม่ต้องสร้างไฟล์หรือไพพ์ใหม่

ตัวอย่างเช่น: บนเทอร์มินัลแรกฉันรันlsและต้องการให้เอาต์พุตของมันถูกแสดงบนเทอร์มินัลที่สอง (โดยมีหรือไม่มีการใช้คำสั่งใด ๆ ในวินาที)


คุณมีอะไร? คุณลองอะไรไหม คุณยกตัวอย่างได้บ้าง
tachomi

@tachomi บนเทอร์มินัลแรกฉันเรียกใช้lsและต้องการให้เอาท์พุทของมันถูกแสดงบนเทอร์มินัลที่สอง (โดยมีหรือไม่มีการใช้คำสั่งใด ๆ ในวินาที)
Edward Torvalds

คำตอบ:


30

หากเทอร์มินัลทั้งสองเป็นของผู้ใช้เดียวกันคุณสามารถส่งเอาต์พุตของคุณไปยังอุปกรณ์เสมือนที่ใช้เป็น tty ของเทอร์มินัลเฉพาะ

ดังนั้นคุณสามารถใช้เอาต์พุตจากwซึ่งรวมถึงข้อมูล TTY และเขียนไปยังอุปกรณ์นั้นโดยตรง

ls > /dev/pts/7

(หากอุปกรณ์ดังกล่าวwเป็น pts / 7)

อีกตัวเลือกหนึ่งคือการใช้จำนวนกระบวนการที่เชื่อมต่อกับอุปกรณ์นั้น /proc/<process number>/fd/1ส่งออกของคุณจะ

ls > /proc/5555/fd/1

สมมติว่าหมายเลขกระบวนการที่คุณพบว่าทำงานในเทอร์มินัลนั้นคือ 5555

โปรดทราบว่าบทความนี้โดยตรงจะได้รับอนุญาตเฉพาะในกรณีที่ผู้ใช้ว่ามีความพยายามที่จะเขียนเป็นผู้ใช้เดียวกันที่เป็นเจ้าของสถานีอื่น


ฉันไม่ได้รับ/dev/pts/7หรือคล้ายกับwคำสั่ง แต่วิธีที่สองใช้งานได้สำหรับฉัน
Edward Torvalds

2
@edwardtorvalds /proc/XXX/fd/1โดยทั่วไปแล้วลิงค์อ่อนไปยังอุปกรณ์ฐาน ลองใช้ls -l /proc/XXXX/fd/1และดูว่ามีอะไรชี้ไปที่ มันมีความสัมพันธ์กับสิ่งที่ปรากฏในwคำสั่งหรือไม่?
RealSkeptic

ฉันไม่เกี่ยวข้องกับwคำสั่งกับ/proc/XXX/fd/0ฉันเกี่ยวข้องกับwคำสั่ง/dev/pts/7
Edward Torvalds

4
@edwardtorvalds ฉันกำลังบอกว่าพวกเขามีการเชื่อมต่อตามที่/proc/XXX/fd/1ควรจะเป็นซอฟท์ลิงค์ไปยังอุปกรณ์อะไรก็ตามที่wคำสั่งแสดง ผลลัพธ์ของls -lมันคืออะไร?
RealSkeptic

ข้อมูล TTY สามารถพบได้ในผลลัพธ์จากtty(ปัจจุบันเท่านั้น) หรือwho(ทั้งหมด)
Nick Volynkin

14

คุณสามารถใช้writeคำสั่ง

ตามที่ @MelBurslan แสดงความคิดเห็นหากการอนุญาตการเขียนปิดอยู่

 $ mesg y

จาก man mesg

ตัวเลือก

y อนุญาตให้เขียนเข้าถึงเทอร์มินัลของคุณ

การใช้งานการเขียน:

$ write username tty

เช่นส่งlsเอาต์พุตไปยังเทอร์มินัลอื่น

$ w
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user     :0       :0               08:15   ?xdm?   7:37   0.25s init --user
user     pts/0    :0               08:19    1.00s  0.09s  0.01s w
user     pts/12   :0               08:50   54.00s  0.03s  0.03s bash

$ ls | write username pts/12

บน arch linux, ในเทอร์มินอล gnome, ผลลัพธ์ของwคำสั่งคือedward tty2 19:53 6:05 2:48 23.12s firefoxและถ้าฉันเขียนls | write edward tty2ฉันจะไม่ได้รับผลลัพธ์ใด ๆ แต่เสียงบี๊บ
Edward Torvalds

@edwardtorvalds คุณปล่อยให้คุณพิมพ์ edwarddแทนที่จะเป็นedward?
tachomi

ด้วยถ้าฉันลองใน tty5 (ctrl + alt + 5) ฉันได้รับข้อผิดพลาดyou have turned write permission off
Edward Torvalds

นั่นคือข้อผิดพลาดในการพิมพ์บนเว็บไซต์นี้
Edward Torvalds

ลองmesg yคำสั่งบนเทอร์มินัลเป้าหมายก่อนที่คุณจะเรียกใช้คำสั่ง
MelBurslan

7

ฉันพบวิธีการที่คล้ายกัน

บนเทอร์มินัลแรก :

 $ tty
 /dev/pts/0
 $ <no need to run any command here, just see the output>

บนเทอร์มินัลที่สอง :

$ ls > /dev/pts/0

ตอนนี้คุณจะได้รับผลลัพธ์บนเทอร์มินัลแรก


1
tail -fแทนที่จะcatเป็นประโยชน์
tachomi

3
@tachomi จริง ๆ แล้วไม่จำเป็นต้องมีคำสั่งใด ๆ ในการอ่านผลลัพธ์
Edward Torvalds

4

ใช้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

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


คำตอบนี้ก็เป็นสิ่งที่ดี
Edward Torvalds

0

คุณสามารถเขียนถึง TTY ของเครื่อง ตัวอย่างเช่น:

ในเทอร์มินัล 1:

$ tty 
ttys000

ในเทอร์มินัล 2:

$ tty
ttys029

$ exec &> >(tee >(cat >&/dev/ttys000))
ls 

เอาต์พุตจะแสดงทั้งสองเทอร์มินัลตามเวลาจริงแม้ในขณะที่คุณพิมพ์

ทำงานบน linux และ macOS เส้นทางของ macOS TTY นั้น/dev/{number}อยู่บน Linux/dev/pts/{number}


exec &> >(tee >(cat >&/dev/ttys000))ไม่มีการดำเนินการทำให้ไม่สามารถพิมพ์ได้
Edward Torvalds

@EdwardTorvalds บน linux ttyจะเป็นอย่างไร/dev/pts/0
Miguel Mota

ใช่นั่นคือสิ่งที่ฉันเคยทดสอบโค้ดของคุณ
Edward Torvalds

@EdwardTorvalds คำสั่งอะไรไม่มีอยู่?
Miguel Mota

exec &> >(tee >(cat >&/dev/pts/1))คำสั่งของคุณ ไม่มีชุดควบคุมคีย์ (ctrl + c) ทำงาน ฉันต้องฆ่า terminal เพื่อออก
Edward Torvalds

-3

คุณสามารถใช้wall:

$ wall "Message here"

คุณอาจต้องการอธิบายรายละเอียด ฉันไม่เข้าใจอะไรจากเรื่องนี้
Edward Torvalds

3
แน่นอนคุณไม่ต้องการใช้wall(ย่อมาจาก "write all") เนื่องจากจะเขียนไปยังเซสชัน tty ที่ล็อกอินทุกครั้งรวมถึงที่คุณส่ง แต่การใช้writeอนุญาตให้ประกาศ tty ที่เจาะจงได้
Monty Harder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.