Lúc đầu, tôi đã cố gắng truy tìm một vài xterm
giây trở lại xterm
pid dựa trên thông tin tôi tìm thấy /proc/locks
nhưng nó bị lỏng lẻo. Ý tôi là, nó hoạt động, tôi nghĩ vậy, nhưng đó là tình huống tốt nhất - tôi không hiểu đầy đủ tất cả thông tin mà tập tin cung cấp và chỉ khớp với những gì dường như tương ứng giữa nội dung của nó và các quy trình đầu cuối đã biết.
Sau đó, tôi đã cố gắng xem lsof/strace
trên một write/talk
quá trình hoạt động giữa các ptys. Tôi chưa bao giờ thực sự sử dụng một trong hai chương trình trước đây, nhưng chúng dường như dựa vào utmp
. Nếu pty mục tiêu của tôi không có utmp
mục vì bất kỳ lý do gì cả hai đều từ chối thừa nhận rằng nó tồn tại. Có lẽ có một cách xung quanh đó, nhưng tôi đã đủ bối rối để từ bỏ nó.
Tôi đã thử một số udevadm
khám phá với 136 và 128 nút thiết bị số chính như được quảng cáo pts
và ptm
tương ứng /proc/tty/drivers
, nhưng tôi cũng thiếu bất kỳ trải nghiệm rất hữu ích nào với công cụ đó và một lần nữa không có gì đáng kể. Thật thú vị, mặc dù, tôi nhận thấy :min
phạm vi cho cả hai loại thiết bị được liệt kê ở mức đáng kinh ngạc 0-1048575
.
Tuy nhiên, cho đến khi tôi xem lại tài liệu hạt nhân này , tôi mới bắt đầu nghĩ về vấn đề này mount
. Tôi đã đọc điều đó nhiều lần trước đây nhưng khi tiếp tục nghiên cứu về dòng đó đã đưa tôi đến bản vá năm 2012 này,/dev/pts
tôi có một ý tưởng:
sudo fuser -v /dev/ptmx
Tôi nghĩ những gì tôi thường sử dụng để liên kết các quá trình với một mount
? Và chắc chắn:
USER PID ACCESS COMMAND
/dev/ptmx: root 410 F.... kmscon
mikeserv 710 F.... terminology
Vì vậy, với thông tin đó tôi có thể làm, ví dụ từ terminology
:
sudo sh -c '${cmd:=grep rchar /proc/410/io} && printf 1 >/dev/pts/0 && $cmd'
###OUTPUT###
rchar: 667991010
rchar: 667991011
Như bạn có thể thấy, với một chút thử nghiệm rõ ràng, một quy trình như vậy có thể được thực hiện để tạo ra một cách đáng tin cậy quá trình tổng thể của một pty tùy ý. Về các ổ cắm, tôi khá chắc chắn một người có thể tiếp cận nó từ hướng đó cũng socat
như sử dụng trái ngược với trình gỡ lỗi, nhưng tôi vẫn chưa nói rõ làm thế nào. Tuy nhiên, tôi nghi ngờ ss
có thể giúp đỡ nếu bạn quen thuộc với nó hơn tôi:
sudo sh -c 'ss -oep | grep "$(printf "pid=%s\n" $(fuser /dev/ptmx))"'
Vì vậy, tôi đã thiết lập nó với một thử nghiệm rõ ràng hơn một chút, thực sự:
sudo sh <<\CMD
chkio() {
read io io <$1
dd bs=1 count=$$ </dev/zero >$2 2>/dev/null
return $((($(read io io <$1; echo $io)-io)!=$$))
}
for pts in /dev/pts/[0-9]* ; do
for ptm in $(fuser /dev/ptmx 2>/dev/null)
do chkio /proc/$ptm/io $pts && break
done && set -- "$@" "$ptm owns $pts"
done
printf %s\\n "$@"
CMD
Nó in $$
num \0
null null cho mỗi pty và kiểm tra io của mỗi tiến trình chính so với kiểm tra trước đó. Nếu sự khác biệt là $$
nó liên kết pid với pty. Điều này chủ yếu hoạt động. Ý tôi là, đối với tôi, nó trả về:
410 owns /dev/pts/0
410 owns /dev/pts/1
710 owns /dev/pts/2
Điều này là chính xác, nhưng, rõ ràng, đó là một chút không phù hợp. Ý tôi là, nếu một trong những người khác đang đọc một loạt dữ liệu vào thời điểm đó thì có lẽ nó sẽ bị mất. Tôi đang cố gắng tìm ra cách thay đổi các stty
chế độ trên một pty khác để gửi bit stop trước hoặc một cái gì đó tương tự để tôi có thể khắc phục điều đó.
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
, sẽ cung cấp danh sách các PID (/proc/PID
) làm đầu ra.