Jeśli zrobię:
echo foo > /dev/pts/12
Niektóre procesy odczytują to foo\n
z deskryptora pliku do strony głównej.
Czy istnieje sposób, aby dowiedzieć się, czym są te procesy?
Lub innymi słowy, jak mogę dowiedzieć się, który xterm / sshd / script / screen / tmux / expect / socat ... znajduje się na drugim końcu /dev/pts/12
?
lsof /dev/ptmx
powie mi procesy, które mają deskryptory plików po stronie master dowolnego pty. Sam proces może użyć ptsname()
( TIOCGPTN
ioctl), aby znaleźć urządzenie slave na podstawie własnego fd po stronie master, więc mógłbym użyć:
gdb --batch --pid "$the_pid" -ex "print ptsname($the_fd)"
dla każdego pid / fd zwróconego w lsof
celu zbudowania tego mapowania, ale czy istnieje bardziej bezpośredni, niezawodny i mniej ingerujący sposób na uzyskanie tych informacji?
terminal-emulator
open-files
pty
Stéphane Chazelas
źródło
źródło
sudo find /proc/*/fd/0 -ls | grep '/dev/pts/4'
, dostarczy listę PIDs (/proc/PID
) jako dane wyjściowe./dev/pts/4
. Zwykle będzie to wspólny przodek tych procesów, które są/dev/pts/4
otwarte, ale niekoniecznie.screen
, to onascreen
alokuje i aktywnie zarządza pty slave przez cały okres eksploatacji urządzenia, ale - jak myślę - powłoka staje się liderem procesu dla tego tty i tak, jak twój pokazuje wyniki, otrzymujeszbash
lub cokolwiek zps
niescreen
. Znalazłem kilka zxterms
powrotem doxterm
pid na podstawie,/proc/locks
ale było luźne.Odpowiedzi:
Na początku próbowałem prześledzić kilka
xterm
sekund z powrotem doxterm
pid na podstawie informacji, które znalazłem,/proc/locks
ale było luźne. Myślę, że zadziałało, jak sądzę, ale w najlepszym razie było okolicznościowe - nie do końca rozumiem wszystkie informacje dostarczane przez plik i pasowały tylko do tego, co wydawało się odpowiadać między jego zawartością a znanymi procesami końcowymi.Potem próbowałem oglądać
lsof/strace
aktywnywrite/talk
proces między ptys. Nigdy wcześniej nie korzystałem z żadnego z tych programów, ale wydaje się, że polegają na nichutmp
. Jeśli mój celowany pty nie miał żadnegoutmp
wpisu z jakiegokolwiek powodu, obaj odmówili przyznania się do jego istnienia. Może jest na to jakiś sposób, ale byłem na tyle zdezorientowany, żeby to porzucić.Próbowałem
udevadm
odkrycia z 136 i 128 głównymi numerami urządzeń, jak w reklamiepts
iptm
odpowiednio/proc/tty/drivers
, ale brakuje mi również bardzo użytecznego doświadczenia z tym narzędziem i po raz kolejny nie znalazłem nic znaczącego. Co ciekawe, zauważyłem, że:min
zasięg dla obu typów urządzeń został wymieniony w oszałamiający sposób0-1048575
.Jednak dopiero po ponownym przejrzeniu tego dokumentu jądra zacząłem myśleć o problemie w kategoriach
mount
s. Przeczytałem to kilka razy wcześniej, ale kiedy dalsze badania w tej linii doprowadziły mnie do tego zestawu łatek z 2012 roku,/dev/pts
wpadłem na pomysł:Pomyślałem, czego zwykle używam do kojarzenia procesów z
mount
? I na pewno:Dzięki tym informacjom mogę na przykład
terminology
:Jak widać, przy odrobinie wyraźnego testowania taki proces mógłby zostać wykonany w celu rzetelnego wyprowadzenia głównego procesu dowolnego pty. Jeśli chodzi o gniazda, jestem całkiem pewien, że można podejść do niego również z tego kierunku, używając
socat
zamiast debuggera, ale muszę jeszcze wyjaśnić, jak to zrobić. Podejrzewam jednak, żess
może ci pomóc, jeśli znasz się bardziej niż ja:Więc skonfigurowałem to z nieco bardziej wyraźnymi testami, w rzeczywistości:
Drukuje
$$
num\0
null bajty na każdym pty i sprawdza io każdego procesu nadrzędnego względem poprzedniego sprawdzenia. Jeśli różnica jest taka,$$
to wiąże pid z pty. To głównie działa. To znaczy dla mnie zwraca:Co jest poprawne, ale oczywiście jest to trochę ryzykowne. Chodzi mi o to, że jeśli któryś z nich czytałby w tym czasie wiele danych, prawdopodobnie by tego nie zauważył. Próbuję wymyślić, jak zmienić
stty
tryby na innym pty, aby najpierw wysłać bit stopu lub coś w tym rodzaju, aby to naprawić.źródło
Jeśli po prostu szukasz, kto jest właścicielem połączenia i skąd są one połączone, polecenie who będzie działać dobrze.
Jeśli chcesz także wiedzieć, co nasłuchuje na tym połączeniu, w pokaże to na końcu.
Aby uzyskać stawki, ogranicz ps do sesji tty, na którą patrzysz. Uruchamianie jest całkowicie dyskretne.
Uwaga: może to prowadzić do czerwonych śledzi, w zależności od czasu. Ale to dobre miejsce na początek.
źródło
/dev/pts/4
, gdzie uruchomiłeś tow
polecenie.Miałem ten sam problem z qemu iw końcu znalazłem bardzo złe rozwiązanie (ale nadal rozwiązanie): analizowanie pamięci procesu.
Działa to tutaj, ponieważ wiem, że qemu przechowuje zdalne pts w ciągu o określonym formacie i przydzielonym na stercie. Może działać również w innych sytuacjach z kilkoma zmianami i ponownie wykorzystując pid z wyjścia utrwalacza (sprawdź inną odpowiedź).
Kod jest dostosowywany stąd .
źródło