2015-06-03 13 views
6

Tôi có một máy chủ đang chạy ở chế độ nhiều người dùng được kết nối với bàn phím và màn hình. Trên một máy tính riêng biệt, tôi muốn SSH đến máy chủ và chạy một chương trình mà bắt đầu vào từ bàn phím và in văn bản vào màn hình. Bàn phím và màn hình sẽ không bao giờ được sử dụng cho bất kỳ mục đích nào khác.Làm thế nào tôi có thể nắm bắt các sự kiện bàn phím và sử dụng màn hình dưới dạng hiển thị văn bản trên Linux?

Ngay bây giờ, khi máy chủ khởi động, màn hình đăng nhập (văn bản) được hiển thị trên màn hình. Tôi biết rằng tôi có thể viết thư cho thiết bị /dev/tty tương ứng. Tuy nhiên, bàn phím cũng ghi vào cùng một vị trí.

Làm cách nào để nắm bắt các sự kiện bàn phím và sử dụng màn hình dưới dạng hiển thị văn bản trên Linux?

Tôi có thể thiếu một số vấn đề cơ bản xung quanh phần cứng giao tiếp trên Linux. Tôi cần biết gì?

Chạy hết thời gian bounty - Nếu ai đó muốn xác thịt này ra xa hơn tôi sẽ trao giải cho phù hợp:

tôi đã phần sau đây để ngăn chặn bất kỳ chương trình đăng nhập từ bắt đầu:

systemctl mask [email protected] 
systemctl mask systemd-logind 
systemctl mask [email protected] 

Sau đó tôi chạy chương trình của tôi khi cần thiết với:

openvt -c 1 -f /path/to/my/program 

Đây sẽ là một giải pháp hoàn toàn thỏa mãn, ngoại trừ rằng pesky -f. Điều gì đang chạy trên tty1? Tôi có thể làm gì để ngăn không? Tôi có nên dừng nó không?

Đáng chú ý, giải pháp này làm đáp ứng mọi nhu cầu của tôi - Theo như tôi hiểu, tôi đang tiếp quản tty và do đó có quyền truy cập vào stdin của nó (nhận đầu ra từ bàn phím) và stdout (in để theo dõi)).

+0

Tại sao không chỉ sshd chạy chương trình thích hợp khi đăng nhập? –

+0

Bạn có thể xây dựng? Tôi không thấy kết nối giữa "cách bắt đầu chương trình" và "chương trình thực hiện mục tiêu của nó như thế nào". – ToBeReplaced

+0

Ồ, tôi hiểu rồi. Bàn phím và màn hình bạn muốn kết nối được kết nối với * server *. Đó là những gì 'openvt' là cho. –

Trả lời

2

Nếu bạn sẵn sàng tham gia chương trình cấp thấp, bạn không phải xử lý stdin hoặc stdout. Chỉ cần nói chuyện trực tiếp với thiết bị bàn phím và thiết bị bàn điều khiển.

Hãy xem mã nguồn của input-events từ input-utils. Nó sử dụng dữ liệu thô để đọc bàn phím, chuột hoặc bất kỳ thiết bị đầu vào nào khác.

Để tránh việc xử lý mặc định của bàn phím nó sử dụng lấy chế độ (-g trong CLI), mà dịch để a:

ioctl(fd,EVIOCGRAB,1) 

trong bộ mô tả tập tin thiết bị. Đọc các sự kiện thô từ /dev/input/event* đơn giản hơn hoặc ít hơn: #include <linux/input.h>, thực hiện thao tác lấy và sau đó đọc các cấu trúc struct input_event từ thiết bị.

Để ghi vào giao diện điều khiển, nếu bạn không muốn gây rối với sự điên rồ TTY, và bây giờ rằng bạn đang ở trong chế độ ở mức độ thấp, bạn có thể thích để viết trực tiếp đến /dev/vcs, hoặc /dev/vcsa cho màu (một cho đầu ra thuộc tính).

Về cơ bản, vcs có một byte trên mỗi ô màn hình chứa mã của ký tự được hiển thị. Trong vcs có hai byte: ký tự và thuộc tính. Xem man vcs để biết chi tiết.

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