Cách gửi đầu ra từ thiết bị đầu cuối này sang thiết bị đầu cuối khác mà không cần tạo bất kỳ đường ống hoặc tệp mới nào


26

Tôi chỉ đang đùa giỡn trên thiết bị đầu cuối của mình (thiết bị đầu cuối Gnome). Tôi đã tự hỏi là có cách nào để gửi đầu ra của một thiết bị đầu cuối đến một thiết bị đầu cuối khác mà không phải tạo một tập tin hoặc đường ống mới.

ví dụ: trên thiết bị đầu cuối đầu tiên tôi chạy lsvà muốn đầu ra của nó được hiển thị trên thiết bị đầu cuối thứ hai (có hoặc không sử dụng bất kỳ lệnh nào trên giây)


bạn có gì? Bạn đã thử một cái gì đó? Bạn có thể cho một số ví dụ?
tachomi

@tachomi trên thiết bị đầu cuối đầu tiên tôi chạy lsvà muốn đầu ra của nó được hiển thị trên thiết bị đầu cuối thứ hai (có hoặc không sử dụng bất kỳ lệnh nào trên giây)
Edward Torvalds

Câu trả lời:


30

Nếu cả hai thiết bị đầu cuối thuộc về cùng một người dùng, bạn có thể gửi đầu ra của mình đến thiết bị ảo được sử dụng làm tty của thiết bị đầu cuối cụ thể.

Vì vậy, bạn có thể sử dụng đầu ra từ w, bao gồm thông tin TTY và ghi trực tiếp vào thiết bị đó.

ls > /dev/pts/7

(Nếu thiết bị được đề cập bởi wpts / 7)

Một tùy chọn khác là sử dụng số lượng của một quá trình được kết nối với thiết bị đó. Gửi đầu ra của bạn đến /proc/<process number>/fd/1.

ls > /proc/5555/fd/1

Giả sử số tiến trình mà bạn thấy chạy trong thiết bị đầu cuối đó là 5555.

Lưu ý rằng ghi trực tiếp này chỉ được phép nếu người dùng cố gắng viết là cùng một người dùng sở hữu thiết bị đầu cuối khác .


Tôi không nhận được /dev/pts/7hoặc tương tự với wlệnh, nhưng cách thứ hai làm việc với tôi
Edward Torvalds

2
@edwardtorvalds /proc/XXX/fd/1Nói chung là một liên kết mềm đến thiết bị cơ sở. Hãy thử sử dụng ls -l /proc/XXXX/fd/1và xem những gì nó được chỉ vào. Liệu nó có liên quan gì đến những gì xuất hiện trong wlệnh không?
RealSkeptic

Tôi không liên quan đến wlệnh với /proc/XXX/fd/0tôi là wlệnh liên quan với/dev/pts/7
Edward Torvalds

4
@edwardtorvalds Tôi đang nói rằng chúng được kết nối như /proc/XXX/fd/1được coi là một liên kết mềm với bất kỳ thiết bị nào mà wlệnh hiển thị. Đầu ra của ls -lnó là gì?
RealSkeptic

Thông tin TTY cũng có thể được tìm thấy trong đầu ra từ tty(chỉ hiện tại) hoặc who(tất cả).
Nick Volynkin 3/03/2016

14

Bạn có thể sử dụng writelệnh.

Như @MelBurslan đã nhận xét, nếu quyền ghi bị tắt, trước tiên hãy thực thi:

 $ mesg y

Từ man mesg

LỰA CHỌN

y Cho phép ghi quyền truy cập vào thiết bị đầu cuối của bạn.

Cách sử dụng viết:

$ write username tty

ví dụ: Gửi lsđầu ra đến thiết bị đầu cuối khác.

$ 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

trên arch linux, trong gnome terminal, đầu ra của wlệnh là edward tty2 19:53 6:05 2:48 23.12s firefoxvà nếu tôi viết, ls | write edward tty2tôi không nhận được đầu ra nào ngoài tiếng bíp
Edward Torvalds

@edwardtorvalds Bạn đã giải phóng bạn đã gõ edwarddthay vì edward?
tachomi

ngoài ra nếu tôi thử nó trên tty5 (ctrl + alt + 5) tôi gặp lỗiyou have turned write permission off
Edward Torvalds

đó là lỗi đánh máy trên trang web này
Edward Torvalds

thử mesg ylệnh trên thiết bị đầu cuối đích, trước khi bạn chạy lệnh
MelBurslan

7

Tôi tìm thấy một phương pháp tương tự.

Trên thiết bị đầu cuối đầu tiên :

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

Trên thiết bị đầu cuối thứ hai :

$ ls > /dev/pts/0

Bây giờ bạn có được đầu ra trên thiết bị đầu cuối đầu tiên


1
tail -fthay vì catcó thể hữu ích
tachomi

3
@tachomi thực sự không cần bất kỳ lệnh nào để đọc đầu ra
Edward Torvalds

4

Sử dụng ttylệnh trong mỗi thiết bị đầu cuối để xác định chúng:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

Giả sử các TTY này, để chuyển hướng thiết bị xuất chuẩn đầu tiên sang thiết bị thứ hai, hãy chạy cái này trong thiết bị đầu cuối đầu tiên:

exec 1>/dev/pts/1

Lưu ý: Bây giờ mọi đầu ra lệnh sẽ hiển thị trên pts / 1

Để khôi phục thiết bị xuất chuẩn mặc định của pts / 0:

exec 1>/dev/pts/0

Xem video này cho một cuộc biểu tình.


câu trả lời này cũng tốt
Edward Torvalds

0

bạn có thể viết thư cho TTY của thiết bị đầu cuối; ví dụ:

trong thiết bị đầu cuối 1:

$ tty 
ttys000

trong thiết bị đầu cuối 2:

$ tty
ttys029

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

Đầu ra sẽ hiển thị trong cả hai thiết bị đầu cuối theo thời gian thực ngay cả khi bạn nhập.

Hoạt động trên linux và macOS. Đường dẫn macOS TTY là /dev/{number}trong khi trên Linux/dev/pts/{number}


thực thi exec &> >(tee >(cat >&/dev/ttys000))không tồn tại, làm cho nó không thể gõ.
Edward Torvalds

@EdwardTorvalds trên linux ttysẽ giống như thế/dev/pts/0
Miguel Mota

vâng, đó là những gì tôi đã sử dụng để kiểm tra mã của bạn
Edward Torvalds

@EdwardTorvalds lệnh nào không tồn tại?
Miguel Mota

lệnh của bạn exec &> >(tee >(cat >&/dev/pts/1)). Không có tổ hợp phím điều khiển (ctrl + c) hoạt động. Tôi phải giết thiết bị đầu cuối để thoát
Edward Torvalds

-3

Bạn cũng có thể sử dụng wall:

$ wall "Message here"

bạn có thể muốn mô tả nó một cách chi tiết. Tôi không hiểu bất cứ điều gì từ điều này
Edward Torvalds

3
Bạn chắc chắn không muốn sử dụng wall(viết tắt của "viết tất cả"), vì nó ghi vào mỗi phiên tty đăng nhập, bao gồm cả phiên bạn đang gửi. Thay vào đó, việc sử dụng writecho phép một tty cụ thể được khai báo.
Monty Harder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.