Làm thế nào tôi có thể chuyển đổi giữa các ttys mà không cần sử dụng màn hình?


17

Vì vậy, giả sử bạn khởi động Linux cài đặt tất cả các máy tính để bàn. Bạn khởi động một gnome-terminal / konsole / bất cứ điều gì để bạn có một tty để nhập lệnh.

Bây giờ hãy nói rằng tôi SSH vào cùng một máy. Nó sẽ ràng buộc tôi với một tty khác để nhập lệnh.

Bây giờ hãy nói rằng tôi muốn "chuyển" tty của mình từ SSH ban đầu sang thiết bị đầu cuối gnome đã bắt đầu trước đó.

Về cơ bản tôi đang hỏi liệu có cách nào để làm điều tương tự screen -xkhông nhưng không có màn hình?

Tôi biết bạn có thể dễ dàng gửi đầu ra cho tty khác chỉ bằng cách lặp lại một cái gì đó vào tệp / dev, nhưng tôi không biết cách để 'xem' những gì trong tty.

Có ý kiến ​​gì không?



Đây có phải là bản sao của unix.stackexchange.com/questions/8469/ không?
mattdm

Câu trả lời:


16

Có lẽ các lược đồ có thể làm rõ tình hình. Đây là cài đặt thông thường:

                               Terminal  (/dev/ttyX or /dev/pts/x)
                                device
                                   |
                    (screen)<--[<output]----x-------(stdout) Process1
        Terminal  (keyboard)---[input >]---o-\----->(stdin)
                                            \ \
(hardware console or                         \ `----(stdout) Process2
 virtual console or terminal                  `---->(stdin)
 emulators like xterm, …)

không có cách nào để cắm một số mới Process3như thế này:

                             Terminal
                              device
                                 |
             (screen)<---o---[<output]--x------(stdout) Process1
  Terminal (keyboard)---/-x--[input >]-o-\---->(stdin)
                       | /              \ \
                       | |               \ `---(stdout) Process2
                       | |                `--->(stdin)
                       | |
                       \ `---------------------(stdout) Process3
                        `--------------------->(stdin)

Màn hình nào (và các màn hình khác) đang phân bổ một số thiết bị đầu cuối giả (như xterm hiện) và chuyển hướng nó đến một hoặc nhiều thiết bị đầu cuối "thực" (vật lý, ảo hoặc mô phỏng):

             Terminal                   pseudo
             devices              ,--> Terminal (/dev/pts/x)
                |         _______/      device
Terminal <--[<output]--- |       |        |
 1       ---[input >]--> |screen | <--[<output]---x-----(stdout) Process1
                         |Process| ---[input >]--o-\--->(stdin)
Terminal <--[<output]--- |       |                \ \
 2       ---[input >]--> |_______|                 \ `--(stdout) Process2
                                                    `-->(stdin)

Sử dụng screen -xbạn có thể đính kèm thêm một thiết bị đầu cuối, xterm, bất cứ điều gì (nói Terminal 3) vào phiên màn hình.

Vì vậy, không, bạn không thể giao tiếp trực tiếp thông qua stdin / stdout với các quy trình được gắn vào một thiết bị đầu cuối khác. Bạn chỉ có thể làm như vậy thông qua quá trình kiểm soát thiết bị đầu cuối này nếu nó là thiết bị đầu cuối giả và nếu quy trình này được che giấu để làm như vậy (giống như màn hình).


Đó là một lời giải thích tuyệt vời! Tôi nghĩ rằng nó không thực sự là một câu trả lời ở đây, nhưng sẽ rất phù hợp với câu hỏi này . Một quan sát: không có cách nào mà chỉ có thể đúng nếu bạn cấm ptrace; cảm ơn ptrace, các chương trình như neercs, rettyvà đôi khi có thể làm điều đó.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles: họ cũng làm một cái gì đó khác: họ thay đổi giá trị của bộ mô tả tệp ( stdin, stdoutở bên phải của lược đồ) bằng cách chiếm quyền điều khiển. Tà ác!
Stéphane Gimenez

1
Hmm, bạn nói đúng, họ thay đổi một mũi tên khác. Ác, nhưng tiện!
Gilles 'SO- ngừng trở nên xấu xa'

8

Không thể kết nối lại các quy trình trên thiết bị đầu cuối khác với thiết bị đầu cuối hiện tại của bạn mà không có thủ đoạn bẩn. Có thể bằng cách buộc quá trình thực hiện các cuộc gọi hệ thống nhất định (với ptrace); Điều này khiến một số chương trình bị sập. Có một số công cụ mà làm được điều này, chẳng hạn như neercs, retty, cryopid, reptyr, ...; xem Làm thế nào tôi có thể từ chối nó một quy trình đang chạy và liên kết nó với một vỏ màn hình mới? và các câu hỏi liên kết.

Có được đầu ra đã được hiển thị trên thiết bị đầu cuối khác là một vấn đề khác. Không có giải pháp hoàn toàn chung: về nguyên tắc, một khi đầu ra đã được kết xuất, thiết bị đầu cuối có thể chỉ lưu trữ dưới dạng hình ảnh. Trong thực tế, tất cả các trình giả lập thiết bị đầu cuối X giữ bộ đệm đầu ra của chúng ở dạng văn bản để bạn có thể sao chép-dán nó. Cách lấy đầu ra đó phụ thuộc vào trình giả lập thiết bị đầu cuối; ý tưởng cơ bản là mô phỏng việc chọn toàn bộ bộ đệm cuộn. Đối với bảng điều khiển Linux, chẳng hạn /dev/tty1, bộ đệm cuộn dễ dàng có sẵn dưới dạng /dev/vcs1(và /dev/vcsa1với các thuộc tính văn bản).

Câu trả lời đơn giản là nếu bạn muốn kết nối lại với một thiết bị đầu cuối từ một nơi khác, hãy sử dụng screenhoặc tmux.

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.