Thực thi lệnh trong thiết bị đầu cuối hoạt động từ xa


10

Giả sử bạn có một trình giả lập thiết bị đầu cuối (T1) mở với mức PID là 6350.

Từ một thiết bị đầu cuối khác, gõ lệnh này (C1):

echo "ls\n" > /proc/6350/fd/0

Điều này viết lsvà dòng mới trong T1 nhưng không thực hiện nó. Tại sao?

Tôi cũng đã thử sử dụng cat|bashvới echo "ls\n" > /proc/catid/fd/0nhưng nó vẫn không được thực thi.

Làm thế nào tôi có thể lặp lại lệnh vào một thiết bị đầu cuối khác và thực hiện lệnh?

câu trả lời có thể

$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;

Trong trường hợp này, bạn không thể viết trực tiếp nữa trong thiết bị đầu cuối (mọi thứ được hiển thị giống như cách hiển thị lệnh (C1) trong thiết bị đầu cuối này.



Tôi đọc nó, nhưng nó không hữu ích lắm.
rvlander

1
Nó có thể không "hữu ích" như trong việc cung cấp cho bạn một cách để làm điều đó, nhưng nó trả lời câu hỏi của bạn: bạn không thể. Bạn có thể cho chúng tôi biết mục tiêu cuối cùng mà bạn đang cố gắng thực hiện và xem liệu có cách nào khác không.
Kevin

Ok bạn không thể nhưng tại sao văn bản được hiển thị trong thiết bị đầu cuối khác?
rvlander

bởi vì bạn gửi văn bản đến giao diện đầu cuối, không phải vào trình bao.
vội vàng

Câu trả lời:


11

Có một tiện ích dòng lệnh được gọi là ttyechocó thể gửi lệnh đến một thiết bị đầu cuối khác (tty / pts) và thực hiện lệnh.

sudo ttyecho -n /dev/pts/5 ls

Xem: Tiện ích để gửi lệnh hoặc dữ liệu đến các thiết bị đầu cuối khác (tty / pts)

Xem thêm: ttyechomã nguồn trên github .

Một lệnh tty thú vị khác là selector, một trình so khớp mẫu tương tác thời gian thực trong bảng điều khiển cập nhật bộ đệm đầu vào tty.

# selector examples
selector -v -x @ <(find . -maxdepth 2 -type d | awk '{print $0"@cd "$0}')
selector -v -x @ <(grep -E -o 'http[^ ]+' fileWithURLS)

Xem: bộ chọn - TÌM KIẾM NĂNG ĐỘNG TRONG TIÊU THỤ


Đáng buồn thay, liên kết đến ttyechomã nguồn trên github dường như bị hỏng. Tuy nhiên, hiện tại nó có sẵn tại github.com/osospeed/ttyecho .
Wilson F

7

Khi bạn đưa ra một ghi vào /dev/pts/X( /proc/6350/fd/0, 12chỉ là một liên kết tượng trưng đến đó), những gì xảy ra là chính xác những điều tương tự xảy ra khi quá trình 6350(hoặc một trong các con của nó, chia hai phù hợp) một cái gì đó kết quả đầu ra: nó ghi vào các thiết bị đầu cuối.

Nếu bạn cố đọc từ thiết bị đó ( cat < /dev/pts/X), những điều thú vị sẽ xảy ra. Bạn sẽ thấy những thứ bạn gõ trong trình bao ban đầu xuất hiện. (Khá có thể chỉ sau dòng mới đầu tiên bạn đã nhập - Tôi đoán chương trình thiết bị đầu cuối ( xtermhoặc bất cứ thứ gì bạn đang sử dụng) thực hiện một số bộ đệm dòng và 6350lớp vỏ bị chặn trên readđó có thể là vỏ; không, giành chiến thắng trong các lần đọc tiếp theo, nhưng tôi rất có thể sai hoàn toàn về điều này.)

Vấn đề là: khi bạn đọc hoặc ghi vào thiết bị đó, bạn sẽ không nói chuyện với lớp vỏ khác đang sử dụng nó. Bạn đang nói chuyện với trình giả lập thiết bị đầu cuối ( xtermví dụ). Chỉ trình giả lập thiết bị đầu cuối mới có thể đưa dữ liệu vào kênh đó (những gì shell đọc) và tất cả những gì shell ghi vào thiết bị đầu cuối. Gắn vỏ thứ hai không thay đổi điều đó.

Nếu bạn muốn đưa các lệnh vào 6530quá trình đó, nó sẽ phải thực hiện điều đó thông qua thiết bị đầu cuối (cho dù đó là ứng dụng X11 hay thứ gì khác).

Đề nghị đọc: Sự khác biệt chính xác giữa 'thiết bị đầu cuối', 'vỏ', 'tty' và 'bàn điều khiển' là gì?


1
Thật thú vị, đọc từ pts ( cat /dev/pts/x, bạn không cần <) Tôi nhận được các chữ cái xen kẽ giữa các thiết bị đầu cuối.
Kevin

Không sử dụng chuyển hướng có thể không thay đổi nhiều. Tôi nhận được đầu ra không thể dự đoán một trong hai cách.
Mat

Thú vị, cảm ơn vì liên kết. Vì vậy, /proc/6350/fd/0một simlink đến cha mẹ stdin process 6350là một thiết bị đầu cuối. Tôi đoán nó là giống nhau cho các ứng dụng cửa sổ?
rvlander
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.