2013-05-05 32 views
8

Tôi muốn viết một bàn điều khiển từ xa, hoạt động như một máy chủ telnet. Người dùng có thể sử dụng telnet để đăng nhập vào máy chủ, sau đó viết một số lệnh để thực hiện một số công việc.Làm cách nào để hiển thị bàn điều khiển từ xa ncurses?

Một ví dụ điển hình cho điều này là bảng điều khiển của bộ định tuyến os. Những gì tôi đang bối rối hiện nay là, tôi có thể chấp nhận đầu vào của người dùng, làm đôi khi in một số văn bản, nhưng tôi muốn sử dụng ncurses để làm cho giao diện điều khiển có nhiều tính năng hơn (chẳng hạn như "cmd auto-complete", màu cú pháp ...), vậy làm thế nào tôi có thể làm điều đó? Bởi vì giao diện điều khiển ở phía người dùng, nếu máy chủ gọi ncurses API, nó sẽ chỉ thay đổi nội dung trên máy chủ ...

Có lẽ đây là một câu hỏi ngu ngốc nhưng tôi thực sự là người mới về điều này. Mọi đề xuất đều được đánh giá cao.

Trả lời

9

Điều này khó hơn bạn nghĩ.

Bạn cần hiểu cách thiết bị đầu cuối hoạt động - chúng sử dụng chuỗi điều khiển đặc biệt cho ví dụ: di chuyển con trỏ hoặc đầu ra màu. Điều này được mô tả bằng một tệp tin terminfo dành riêng cho thiết bị đầu cuối. Ncurses dịch các cuộc gọi API (ví dụ: di chuyển con trỏ đến một vị trí nhất định) đến các chuỗi điều khiển như vậy bằng cách sử dụng terminfo.

Kể từ khi thiết bị đầu cuối (ngày nay xterm, gnome-terminal, screen, tmux, vv) là ở phía khách hàng, bạn phải vượt qua các loại thiết bị đầu cuối từ máy khách đến máy chủ. Đó là lý do tại sao ví dụ ssh chuyển thông tin này từ máy khách ssh đến máy chủ (thử echo $TERM trong phiên ssh của bạn - có thể là 'linux' nếu bạn đăng nhập qua bảng điều khiển hoặc 'xterm', nếu bạn đang sử dụng X và xterm). Ngoài ra, bạn tốt hơn có terminfo tương ứng có sẵn trên máy chủ.

Một phần khác của câu đố là thiết bị đầu cuối giả. Vì ngày nay tương đối ít người sử dụng thiết bị đầu cuối nối tiếp, ngữ nghĩa của chúng được mô phỏng để các ứng dụng và thư viện (ví dụ: curses và bạn bè của nó) được phát triển ban đầu cho bộ điều khiển nối tiếp tiếp tục hoạt động. Điều này đạt được thông qua các thiết bị đầu cuối giả - chúng giống như các đường ống, một thiết bị chủ và một thiết bị nô lệ giao tiếp, bất cứ thứ gì được viết trên một mặt đều xuất hiện ở phía bên kia. Ví dụ: đối với quy trình đăng nhập, getty chỉ có thể sử dụng một mặt của thiết bị pty và coi đó là dòng nối tiếp - chương trình máy chủ phải xử lý mặt khác của pty, gửi mọi thứ từ pty đến máy khách của bạn thông qua mạng.

ga giả lập cũng sử dụng ptys, gõ tty vào thiết bị đầu cuối của bạn, và bạn sẽ nhận được một cái gì đó giống như /dev/pts/9 nếu bạn đang sử dụng một mô phỏng thiết bị. Ở phía bên kia của pty nó thường là shell của bạn, giao tiếp với trình mô phỏng thiết bị đầu cuối của bạn thông qua pty.

Chương trình khách hàng của bạn có thể nhiều hơn hoặc ít hơn chỉ sử dụng đầu vào tiêu chuẩn và đầu ra tiêu chuẩn. Nếu thông tin thiết bị đầu cuối của bạn là chính xác, phần còn lại sẽ được xử lý bởi trình giả lập thiết bị đầu cuối của bạn, chỉ cần chuyển bất kỳ thứ gì bạn nhận được từ chương trình máy chủ của bạn tới stdout và gửi bất cứ điều gì bạn đọc từ stdin đến chương trình máy chủ của bạn.

Hy vọng rằng tôi chưa bỏ sót bất kỳ chi tiết quan trọng nào. Chúc may mắn!

2

Có thể có ncurses hoạt động trên các luồng khác với stdin và stdout. Gọi newterm() trước initscr() để đặt xử lý tệp đầu vào và đầu ra cho ncurses.Nhưng bạn sẽ cần phải biết loại thiết bị đầu cuối nào ở đầu cuối của kết nối (ssh và telnet đều có cơ chế để truyền thông tin này đến máy chủ) và bạn cũng sẽ muốn quay trở lại giao diện không ncurses trong trường hợp đầu cuối từ xa không phải là loại thiết bị đầu cuối được hỗ trợ (hoặc nếu bạn không thể xác định loại thiết bị đầu cuối).

Các vấn đề liên quan