Trình giả lập thiết bị đầu cuối
Phía chính thay thế đường dây (cặp dây TX / RX) đi đến thiết bị đầu cuối.
Thiết bị đầu cuối hiển thị các ký tự mà nó nhận được trên một trong các dây (một số trong số đó là các ký tự điều khiển và làm cho nó thực hiện những việc như di chuyển con trỏ, thay đổi màu sắc ...) và gửi trên dây khác các ký tự tương ứng với các phím bạn nhập.
Các trình giả lập thiết bị đầu cuối như xterm không khác nhau ngoại trừ việc thay vì gửi và nhận các ký tự trên dây, chúng đọc và viết các ký tự trên bộ mô tả tệp của chúng cho phía chủ. Khi họ đã sinh ra thiết bị đầu cuối nô lệ và bắt đầu trình bày của bạn trên đó, họ không còn chạm vào đó nữa. Ngoài việc mô phỏng cặp dây, xterm cũng có thể thay đổi một số thuộc tính kỷ luật dòng thông qua bộ mô tả tệp đó sang phía chủ. Chẳng hạn, họ có thể cập nhật các thuộc tính kích thước để SIGWINCH được gửi đến các ứng dụng tương tác với pty nô lệ để thông báo cho họ về kích thước đã thay đổi.
Ngoài ra, có rất ít thông minh trong trình giả lập thiết bị đầu cuối / thiết bị đầu cuối.
Những gì bạn viết cho một thiết bị đầu cuối (như nô lệ pty) là những gì bạn muốn hiển thị ở đó, những gì bạn đọc từ nó là những gì bạn đã gõ ở đó, do đó, không có nghĩa gì khi trình giả lập thiết bị đầu cuối đọc hoặc ghi vào đó . Họ là những người ở đầu kia.
Các kỷ luật dòng tty
Rất nhiều thông tin tình báo là trong những kỷ luật dòng tty . Kỷ luật dòng là một mô-đun phần mềm (nằm trong trình điều khiển, trong kernel) được đẩy lên trên một thiết bị nối tiếp / pty nằm giữa thiết bị đó và đường / dây (phía chính cho pty).
Một dòng nối tiếp có thể có một thiết bị đầu cuối ở đầu kia, nhưng cũng có một con chuột hoặc một máy tính khác để kết nối mạng. Ví dụ, bạn có thể đính kèm một kỷ luật dòng SLIP để có giao diện mạng trên đầu thiết bị nối tiếp (hoặc thiết bị pty) hoặc bạn có thể có kỷ luật dòng tty . Kỷ luật dòng tty là kỷ luật dòng mặc định ít nhất là trên Linux đối với các thiết bị nối tiếp và pty. Trên Linux, bạn có thể thay đổi kỷ luật dòng với ldattach
.
Bạn có thể thấy tác dụng của việc vô hiệu hóa kỷ luật dòng tty bằng cách phát hành stty raw -echo
(lưu ý rằng dấu nhắc bash hoặc các ứng dụng tương tác khác như vi
đặt thiết bị đầu cuối ở chế độ chính xác mà chúng cần, vì vậy bạn muốn sử dụng ứng dụng câm như thế cat
để trải nghiệm điều đó). Sau đó, mọi thứ được ghi vào thiết bị đầu cuối nô lệ sẽ ngay lập tức đến phía chủ để xterm đọc và mọi ký tự được viết bởi xterm sang phía chủ đều có sẵn để đọc từ thiết bị nô lệ.
Kỷ luật dòng là nơi trình soạn thảo dòng nội bộ của thiết bị đầu cuối được triển khai. Ví dụ với stty icanon echo
(như là mặc định), khi bạn nhập a
, xterm ghi a
vào bản gốc, sau đó dòng kỷ luật lặp lại (tạo a
sẵn để đọc bằng cách xterm
hiển thị), nhưng không cung cấp bất cứ điều gì có sẵn để đọc ở phía nô lệ . Sau đó, nếu bạn gõ backspace, xterm gửi một ^?
hoặc ^H
nhân vật, kỷ luật dòng (như ^?
hoặc ^H
tương ứng với erase
thiết lập kỷ luật dòng) gửi lại trên tổng thể một ^H
, space
và ^H
cho xterm
đến xóaa
bạn vừa gõ trên màn hình của nó và vẫn không gửi bất cứ thứ gì đến ứng dụng đang đọc từ phía nô lệ, nó chỉ cập nhật bộ đệm trình chỉnh sửa dòng bên trong để xóa cái mà a
bạn đã gõ trước đó.
Sau đó, khi bạn nhấn Enter, xterm sẽ gửi ^M
(CR), mà kỷ luật dòng chuyển đổi trên đầu vào thành ^ J (LF) và gửi những gì bạn đã nhập cho đến nay để đọc ở phía nô lệ (một ứng dụng đọc trên /dev/pts/x
sẽ nhận được những gì bạn đã nhập bao gồm cả LF, nhưng không phải a
vì bạn đã xóa nó), trong khi ở phía chính, nó sẽ gửi CR và LF để di chuyển con trỏ đến dòng tiếp theo và bắt đầu màn hình.
Kỷ luật dòng cũng chịu trách nhiệm gửi SIGINT
tín hiệu đến nhóm quy trình tiền cảnh của thiết bị đầu cuối khi nó nhận được một ^C
ký tự ở phía chủ, v.v.
Nhiều ứng dụng thiết bị đầu cuối tương tác vô hiệu hóa hầu hết các tính năng của kỷ luật dòng đó để tự thực hiện. Nhưng trong mọi trường hợp, hãy cẩn thận rằng thiết bị đầu cuối ( xterm
) ít liên quan đến điều đó (ngoại trừ hiển thị những gì nó được bảo hiển thị).
Và có thể chỉ có một phiên cho mỗi quy trình và mỗi thiết bị đầu cuối. Một phiên có thể có một thiết bị đầu cuối kiểm soát được gắn vào nó nhưng không phải (tất cả các phiên bắt đầu mà không có thiết bị đầu cuối cho đến khi chúng mở một thiết bị đầu cuối). xterm
, trong quá trình nó thực thi shell của bạn thường sẽ tạo ra một phiên mới (và do đó tách ra khỏi thiết bị đầu cuối nơi bạn khởi chạy xterm
nếu có), mở cái mới /dev/pts/x
mà nó đã sinh ra, bằng cách gắn thiết bị đầu cuối đó vào phiên mới. Sau đó, nó sẽ thực thi shell của bạn trong quá trình đó, vì vậy shell của bạn sẽ trở thành người dẫn đầu phiên. Shell của bạn hoặc bất kỳ shell tương tác nào trong phiên đó thường sẽ xử lý các nhóm quy trình và tcsetpgrp()
, để đặt các công việc nền trước và nền cho thiết bị đầu cuối đó.
Đối với những thông tin nào được lưu trữ bởi một thiết bị đầu cuối với kỷ luật tty (nối tiếp hoặc pty) , đó thường là những gì stty
lệnh hiển thị và sửa đổi. Tất cả cấu hình kỷ luật: kích thước màn hình đầu cuối, cục bộ, cờ đầu ra đầu vào, cài đặt cho các ký tự đặc biệt (như ^ C, ^ Z ...), tốc độ đầu vào và đầu ra (không liên quan đến ptys). Điều đó tương ứng với tcgetattr()
/ các tcsetattr()
chức năng trên bản đồ Linux với TCGETS
/ TCSETS
ioctls và TIOCGWINSZ
/ TIOCSWINSZ
cho kích thước màn hình. Bạn có thể lập luận rằng nhóm quy trình tiền cảnh hiện tại là một thông tin khác được lưu trữ trong thiết bị đầu cuối ( tcsetpgrp()
/ tcgetpgrp()
, TIOC{G,S}PGRP
ioctls) hoặc bộ đệm đầu vào hoặc đầu ra hiện tại.
Lưu ý rằng thông tin kích thước màn hình được lưu trữ trong thiết bị đầu cuối có thể không phản ánh đúng thực tế. Trình giả lập thiết bị đầu cuối thường sẽ đặt nó (thông qua cùng một ioctl trên kích thước chính) khi cửa sổ của nó được thay đổi kích thước, nhưng nó có thể không đồng bộ nếu một ứng dụng gọi ioctl ở phía nô lệ hoặc khi không thay đổi kích thước (trong trường hợp thay đổi kích thước của một kết nối ssh ngụ ý một pty khác được sinh ra bởi sshd
nếu ssh
bỏ qua SIGWINCH
ví dụ). Một số thiết bị đầu cuối cũng có thể được truy vấn kích thước của chúng thông qua các chuỗi thoát, vì vậy một ứng dụng có thể truy vấn theo cách đó và cập nhật kỷ luật dòng với thông tin đó.
Để biết thêm chi tiết, bạn có thể xem qua các trang termios
và tty_ioctl
man trên Debian chẳng hạn.
Để chơi với các môn học khác:
Giả lập một con chuột với một thiết bị đầu cuối giả:
socat pty,link=mouse fifo:fifo
sudo inputattach -msc mouse # sets the MOUSE line discipline and specifies protocol
xinput list # see the new mouse there
exec 3<> fifo
printf '\207\12\0' >&3 # moves the cursor 10 pixels to the right
Ở trên, phía chủ của pty được kết thúc bởi socat trên một ống có tên ( fifo
). Chúng tôi kết nối fifo đó với một tiến trình (trình bao) ghi 0x87 0x0a 0x00 có nghĩa là trong giao thức hệ thống chuột no button pressed, delta(x,y) = (10,0)
. Ở đây, chúng tôi (vỏ) không mô phỏng thiết bị đầu cuối, nhưng một con chuột, 3 byte chúng tôi gửi sẽ không được đọc (có khả năng chuyển đổi) bởi một ứng dụng từ thiết bị đầu cuối ( mouse
bên trên là một liên kết tượng trưng được tạo bởi socat
một số /dev/pts/x
thiết bị) , nhưng được hiểu là một sự kiện nhập chuột.
Tạo giao diện SLIP:
# on hostA
socat tcp-listen:12345,reuseaddr pty,link=interface
# after connection from hostB:
sudo ldattach SLIP interface
ifconfig -a # see the new interface there
sudo ifconfig sl0 192.168.123.1/24
# on hostB
socat -v -x pty,link=interface tcp:hostA:12345
sudo ldattach SLIP interface
sudo ifconfig sl0 192.168.123.2/24
ping 192.168.123.1 # see the packets on socat output
Ở trên, dây nối tiếp được mô phỏng socat
như một ổ cắm TCP ở giữa hostA và hostB. Kỷ luật dòng SLIP diễn giải các byte được trao đổi trên dòng ảo đó dưới dạng các gói IP được đóng gói SLIP để phân phối trên sl0
giao diện.