Làm cách nào tôi có thể nối vào đầu ra của một thiết bị đầu cuối từ một thiết bị đầu cuối khác?


45

Tôi cần nối vào đầu ra của thiết bị đầu cuối hiện đang chạy (tty1) từ thiết bị đầu cuối ảo và chụp nó (máy chủ X đang chạy).


5
Mặc dù tôi hiểu rằng đôi khi cần phải thu thập nội dung trên một tty khác sau khi lệnh đang chạy, một ounce phòng ngừa đáng giá một pound thuốc chữa bệnh, vì vậy hãy luôn cân nhắc bắt đầu sử dụng screenhoặc tmuxtrước khi bắt đầu một lệnh mà bạn có thể muốn truy cập từ thiết bị đầu cuối khác .
depquid

Và khi bạn có thể chuẩn bị nó trước đó, có lẽ tmate cũng sẽ là một ứng cử viên tuyệt vời, thậm chí làm việc trên internet và không chỉ địa phương. (và có quyền truy cập ghi tùy chọn)
rugk

Câu trả lời:


23

Tôi đã đi qua một công cụ được gọi là ttylog. Đây là một chương trình Perl có sẵn trên CPAN tại đây . Nó có một vài cảnh báo, một điều là tôi chỉ có thể tìm ra cách gắn vào thiết bị đầu cuối được tạo ra như một phần của ai đó đang nhét vào hộp của tôi. Cái khác là bạn phải chạy nó với các đặc quyền nâng cao (tức là root hoặc sudo).

Nhưng nó đã có tác dụng!

Ví dụ

Ssh đầu tiên vào hộp của bạn trong HẠN # 1:

TERM#1% ssh saml@grinchy

Lưu ý tty thiết bị đầu cuối mới này:

TERM#1% tty
/dev/pts/3

Bây giờ trong một thiết bị đầu cuối khác (TERM # 2) chạy lệnh này:

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]

Bây giờ hãy quay lại HẠN # 1 và nhập nội dung, nó sẽ hiển thị trong HẠN # 2.

ss của thiết bị đầu cuối

Tất cả các lệnh tôi đã thử, (trên cùng, ls, v.v.) đã hoạt động mà không gặp sự cố khi sử dụng ttylog.


Chính xác những gì tôi đang tìm kiếm (tôi đã sử dụng nó trong quá khứ, nhưng quên tên và không thể nhớ lại). Rất cám ơn, tôi tạm thời sử dụng tùy chọn bẩn (gdb và sao chép đầu ra).
pruzinat

Vâng, đó gdblà lựa chọn đầu tiên tôi gặp, trước đây tôi đã từng sử dụng nó, nhưng ít nhất thì nó cũng rất khó chịu. Vui mừng điều này đã giúp bạn ra ngoài!
slm

1
Mặc dù vậy, ttylog dường như không thể đính kèm đúng quy trình - bất kỳ ai cũng có thể trả lời câu hỏi của tôi: serverfault.com/questions/560972/
Kẻ

21

Quả thực là như vậy. Các thiết bị / dev / vcs * và / dev / vcsa * tương ứng với các thiết bị / dev / tty * (các thiết bị đầu cuối ảo). F1 = tty1 = vcs1 / vcsa1, v.v. Vcs / vcsa giống như tty cho thiết bị đầu cuối ảo "hiện tại".

Với quyền root, bạn chỉ có thể cat các thiết bị này (ví dụ cat / dev / vcs2) và xem những gì trên VT tương ứng (ví dụ / dev / tty2 trên F2) như chụp ảnh nhanh. vcsa * khác với vcs * ở chỗ chúng bao gồm thông tin về kích thước của thiết bị đầu cuối (màn hình). Xin lưu ý bạn, đó chỉ là một ảnh chụp nhanh các ký tự khi chúng hiển thị trên màn hình - được tập hợp từ bộ nhớ được phân bổ cho thiết bị đầu cuối - vì vậy đừng mong đợi kết quả phân tích dễ dàng, dễ dàng.

Hạn chế là nếu thông tin lóe lên quá nhanh, có thể khó nắm bắt. Có lẽ đuôi -f / dev / vcs1 sẽ hoạt động, nếu bạn cần theo dõi một số màn hình (chưa thử bản thân mình)? Đầu tiên có thể dễ dàng nhất là chuyển hướng nó đến một tập tin. Nó cũng có thể là một ý tưởng tốt để sử dụng VT (F1-F6) để xem xét nó, vì các thiết bị đầu cuối sẽ có cùng kích thước. Theo kinh nghiệm của tôi, tốt nhất là sử dụng các thiết bị vcs * - chứ không phải vcsa * -.

Nếu điều đó không hiệu quả, có lẽ một trong những gói "anh lớn" cho phép quản trị viên để mắt đến hoạt động trên thiết bị đầu cuối có thể hoạt động.

PS: Tôi quên hỏi bạn sử dụng HĐH nào. Điều này là dành cho Linux, mặc dù các thiết bị tương tự cũng có thể tồn tại trên các HĐH khác. Hãy thử tìm kiếm "bộ nhớ bảng điều khiển ảo" trong số các trang dành cho thiết bị.


Có cách nào để tiêm đầu vào vào tty1 từ ssh không? Ví dụ, tôi cần phải làm việc với một raspberry pi chạy Debian, nhưng vấn đề là nó chỉ có một cổng usb, nó được sử dụng bởi bộ điều hợp wifi và vì vậy tôi không thể gắn bàn phím để sử dụng tty1 với nó. Vì tôi cần chạy một kịch bản mà trong quá trình thực thi, tắt wlan0, tôi thực sự có một tình huống Catch-22 đang cố gắng gỡ lỗi khi kịch bản này bị lỗi. Giả sử tôi không thể sử dụng một trung tâm usb ... có cách nào để tôi chuyển các ký tự vào / dev / tty1 không?
Steven Lu

2
Tốt. Tôi có thể chuyển các công cụ thành /dev/tty1root nhưng tất cả những điều này là hiển thị các ký tự trên màn hình, không nhập chúng
Steven Lu

1
Xin lỗi nếu đây chỉ là tiếng ồn. nó không thực sự liên quan 100%. Nhưng tôi đã trả lời câu hỏi của mình trong phần bình luận ở trên với điều này
Steven Lu

18

nhìn vào:

man 1 script

ví dụ:

script -f /dev/tty1

Tôi vẫn đang tìm kiếm điều này. Cố chấp bằng screenthất bại thảm hại. Nó hoạt động.
sdkks

5

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.


2

Điều này làm việc cho tôi:

  • Sử dụng bàn phím trên máy tính "A" (tức là máy tính vật lý cần điều khiển), chạy: screen -q

  • Kết nối với sshtừ máy tính "B" với máy tính "A".

  • Trong phiên ssh, gõ: screen -lsđể có id phiên để kết nối (4 chữ số trên hàng có chứa tty ).

  • Kết nối với phiên trên với: screen -x <session id>... bằng cách sử dụng số id phiên nhận được từ screen -lslệnh trên.

Bất cứ điều gì được nhập vào một trong hai "phiên" sẽ xảy ra trong cả hai "phiên", vì vậy, ví dụ gõ screen -dsẽ thoát khỏi cả phiên.


1

Một cách tiếp cận khác là sử dụng screentiện ích gnu trên máy cục bộ của bạn. Gọi nó với -Ltùy chọn, hoặc bắt đầu mà không có tùy chọn đó và sử dụng ^aHchuỗi lệnh. Cách tiếp cận làm cho tất cả đầu vào và đầu ra được ghi vào một tệp có tên screenlog.xx là số màn hình.

Điều này rất tiện lợi vì không cần cài đặt thêm gì trên máy từ xa.


1

Vì tôi không bắt đầu tty1 với màn hình nên kịch bản này đã giúp:

Tôi đã sử dụng câu trả lời từ Baard Kopperud ở trên. "128" là 1 dòng tty1 của tôi. Giấc ngủ có thể được đặt thành một số thích hợp.

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

Tôi đã sử dụng điều này trong terminator và định cỡ cột để cuộn là một dòng văn bản.


Cảm ơn về ý tưởng này, trên rasperry, tôi chỉ cần thực hiện '' 'xem cat / dev / vcs' '' Để xem một quá trình tôi bắt đầu trên một bảng điều khiển ảo mà quên mất việc sử dụng 'màn hình'. Và tôi vừa điều chỉnh thiết bị đầu cuối gnome của mình, tôi chạy nó với chiều rộng 80 ký tự.
axkibe

0

Mở hai thiết bị đầu cuối. Nhập ttytừng cái và bạn sẽ nhận được id/dev/pts/nº

Sau đó, trong lần đầu tiên bạn nhập script -f /dev/pts/nºofSecondTerminalvà trong lần thứ hai, bạn làm ngược lại script -f /dev/pts/nºofFirstTerminalđể chúng được liên kết

Chúc mừng! Cả hai thiết bị đầu cuối xuất và nhận cùng một thứ. Cần một phần ba? Vâng, bạn đã nghiên cứu kết hợp? Bạn sẽ cần 6 script -flệnh. Thậm chí nhiều tty? Sớm...

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.