Co jest przechowywane w plikach / dev / pts i czy możemy je otworzyć?

73

Według mojej wiedzy /dev/ptspliki są tworzone dla sesji ssh lub telnet.

użytkownik2720323
źródło
6
echo Hello > /dev/pts/1... Zobacz, co się stanie, to twój terminal.
Sepahrad Salour
5
Zobacz także Jak działa terminal Linux?
Gilles
1
@SepahradSalour należy dostosować numer pts do jego kontekstu. mój sshd użył / dev / pts / 30 do mojej sesji.
Gab 是 好人
2
@Gab 是 好人 Aby uzyskać lokalizację bieżącego terminala, możesz użyć polecenia tty.
JeromeJ

Odpowiedzi:

110

Nic nie jest przechowywane /dev/pts. Ten system plików żyje wyłącznie w pamięci.

Wpisy /dev/ptspseudoterminalami (w skrócie pty). Jądra uniksowe mają ogólne pojęcie terminali . Terminal zapewnia aplikacjom sposób wyświetlania danych wyjściowych i odbierania danych wejściowych za pośrednictwem urządzenia końcowego . Proces może mieć terminal sterujący - w przypadku aplikacji w trybie tekstowym jest to sposób interakcji z użytkownikiem.

Terminale mogą być terminalami sprzętowymi („tty”, skrót „teletype”) lub pseudo-terminalami („pty”). Terminale sprzętowe są podłączone przez niektóre interfejsy, takie jak port szeregowy ( ttyS0,…) lub USB ( ttyUSB0,…), lub za pomocą ekranu komputera i klawiatury ( tty1,…). Pseudo-terminale są dostarczane przez emulator terminala, który jest aplikacją. Niektóre typy pseudo-terminali to:

  • Aplikacje GUI, takie jak xterm, gnome-terminal, konsola,… przekształcają zdarzenia klawiatury i myszy na wprowadzanie tekstu i wyświetlają dane wyjściowe graficznie za pomocą niektórych czcionek.
  • Aplikacje multipleksera, takie jak wejście i wyjście przekaźnika ekranowego i tmux zi do innego terminala, aby oddzielić aplikacje w trybie tekstowym od faktycznego terminala.
  • Aplikacje zdalnej powłoki, takie jak sshd, telnetd, rlogind,… przekaźnikowe wejście i wyjście między zdalnym terminalem na kliencie a pty na serwerze.

Jeśli program otworzy terminal do zapisu, dane wyjściowe z tego programu pojawią się na terminalu. Powszechnie jest, że kilka programów wysyła jednocześnie dane do terminala, choć czasem może to być mylące, ponieważ nie ma sposobu, aby stwierdzić, która część wyniku pochodzi z którego programu. Procesy w tle, które próbują zapisać na swoim terminalu sterującym, mogą zostać automatycznie zawieszone przez sygnał SIGTTOU .

Jeśli program otworzy terminal do odczytu, dane wejściowe użytkownika są przekazywane do tego programu. Jeśli wiele programów odczytuje z tego samego terminala, każdy znak jest kierowany niezależnie do jednego z programów; nie jest to zalecane. Zwykle w danym momencie tylko jeden program aktywnie odczytuje z terminala; programy, które próbują czytać z terminala sterującego, gdy nie znajdują się na pierwszym planie,automatycznie zawieszane przez sygnał SIGTTIN .

Aby eksperymentować, uruchom ttyw terminalu, aby zobaczyć, jakie jest urządzenie końcowe. Powiedzmy, że to /dev/pts/42. W powłoce w innym terminalu uruchom echo hello >/dev/pts/42: ciąg hellozostanie wyświetlony na drugim terminalu. Teraz uruchom cat /dev/pts/42i wpisz drugi terminal. Aby zabić to catpolecenie (co utrudni korzystanie z drugiego terminala), naciśnij Ctrl+ C.

Pisanie na innym terminalu jest czasami przydatne do wyświetlenia powiadomienia; na przykład writepolecenie to robi. Odczytywanie z innego terminala zwykle nie jest wykonywane.

Gilles
źródło
Albo źle rozumiem, co próbujesz powiedzieć, albo twoje informacje są wyłączone. Procesy działające w tle, zapisujące do terminala, nie powodują SIGTTIN. Nie można jednocześnie odczytywać wielu programów z terminala (oświadczenie, że „każdy znak jest kierowany niezależnie”). Tylko jeden program może odczytywać z terminala w dowolnym momencie, a próba odczytu z tego terminala przez program działający w tle spowoduje SIGTTIN. Jest to jedyny przypadek, w którym SIGTTIN jest wysyłany automatycznie.
Patrick
Nie można także czytać z innego terminala. Byłoby to znaczną luką w zabezpieczeniach, ponieważ można przechwytywać dane. Możesz straceprogram czytać dane wejściowe, ale to wszystko.
Patrick
4
@Patrick W tle procesy zapisujące do terminala otrzymują SIGTTOU, co było literówką. Wiele programów może jednocześnie czytać z terminala (spróbuj i zobacz, jak opisałem w następnym akapicie; musisz to zrobić z procesu, którego terminalem sterującym nie jest ten terminal). Tak, możesz czytać z innego terminala, o ile należy on do ciebie - dlaczego twoim zdaniem byłoby to niemożliwe?
Gilles
Procesy działające w tle zapisujące do terminala otrzymują SIGTTOU tylko wtedy, gdy tostopustawiona jest flaga tty. Ta flaga nie jest ustawiona domyślnie. I jestem poprawiony na czytaniu od innego TTY. Próbowałem i działa, ale działa to na podstawie odczytu, a nie na znak (gdy są wyświetlane w zachęcie powłoki, są takie same, jak powłoki odczytują 1 znak na raz). Warto wyjaśnić tę kwestię, ponieważ właśnie w ten sposób zinterpretowałem twoją odpowiedź.
Patrick,
2
@Patrick Pewnie, readwywołanie zwróci tylko kolejne znaki (a raczej bajty, powinienem powiedzieć), ale aplikacja nie ma kontroli nad tym, ile bajtów readzwróci wywołanie, więc nie jest lepiej.
Gilles
18

Pliki w /dev/ptsto „pseudo-ttys”. W pewnym stopniu przypominają nazwane rury, ale imitują również stare terminale szeregowe, takie jak VT-100. Pseudo-tty wykonują transfer bajtów z klawiatury do programu oraz z programu do urządzenia wyjściowego, co brzmi prosto. Ale to odpowiada na twoje wyraźne pytanie: jądro niczego /dev/pts/0na przykład nie przechowuje . Wchodzą tylko strumienie bajtów ze standardowego programu podłączonego do pseudo-tty, a programy, których standardowe wejście jest podłączone do tego samego pseudo-tty, odczytują te bajty.

Pseudo-tty również umieszczają warstwę pośrednią w tych strumieniach bajtów. Jądro może sprawdzać bajty pod kątem specjalnych wartości, takich jak „Control-C” lub „Control-D” lub „Control-U” (wszystkie są konfigurowalne, patrz man stty) i wysyłać SIGINT, ustawiać koniec pliku na standardowe wyjście lub kasować linia na wejściu. Gdzieś tam jest też funkcja buforowania, więc moje „przechowywanie niczego” jest nieco błędne, ale tylko o kilka kilobajtów.

Jądro może sprawdzać wartości bajtów na wyjściu i wykonywać takie czynności, jak przekształcanie nowego wiersza (ASCII linefeed, LF lub "\n") w dwa bajty, powrót karetki i linefeed (CRLF lub "\r\n") lub cokolwiek innego, czego wymaga sprzęt na terminalu szeregowym. Pośrednictwo pseudo-tty pozwala na niezależność od sprzętu.

Pseudo-tty pozwalają również na wszystkie „ ioctl()systemowe szybkości transmisji”, „ustawianie parzystości” i tak dalej , i prawdopodobnie nic z nimi nie robią. Pozwala to programom, które zostały zapisane w dniu VT-100, ADM-3 i Whatever Wyse, kontynuować pracę bez pomyłek. Oprogramowanie, sterownik urządzenia pseudo-ttys, działa jak sprzęt.

Pseudo-tty mogą być używane przez sshdi telnet, ale są również używane między emulatorem terminala (takim jak xtermlub rxvt) a powłoką, która zazwyczaj działa wewnątrz xterm.

Linux i wiele uniksów ma pseudo-tty. Plan 9 nie. Pseudo-tty są trochę reliktem, pozostałym po dniach terminali sprzętowych podłączonych kablem szeregowym.

Bruce Ediger
źródło
13

/dev/to specjalny katalog dla plików urządzeń. To są abstrakcje, nie są prawdziwymi plikami na dysku. Katalog jest wypełniana przy starcie i może ulec zmianie w celu uwzględnienia istniejących interfejsów urządzeń, które są tworzone i niszczone przez jądra i demona przestrzeni użytkownika, udevd.

Wiele reprezentowanych w ten sposób urządzeń jest wirtualnych. Obejmuje to wpisy w /dev/pts, które są urządzeniami konsoli. Dlatego stworzono jedną z nich dla sesji zdalnych; są one również tworzone po otwarciu lokalnego terminala GUI.

Możesz je otworzyć jako pliki, chociaż nie ma to dużej wartości użytkowej. Aby uzyskać /dev/ptswęzeł, do którego podłączona jest powłoka, użyj tty:

> tty
/dev/pts/4

Teraz przełącz się na inną konsolę i spróbuj:

> echo "duck!" > /dev/pts/4

Sprytny. Spróbuj teraz:

> cat /dev/pts/4

Następnie spróbuj użyć powłoki w / dev / pts / 4. Utkniesz, dopóki nie wyjdziesz catz drugiej strony, ale większość tego, co wpiszesz na pts / 4, przejdzie (np. Wypróbowanie „hello world”, na którym skończyłem hlna pts / 4 i ello wordna catkonsoli).

Domyślam się, że urządzenie pobiera dane wejściowe z powłoki i wysyła je przez system, tak jak rzeczy trafiają na ekran - powłoka nie obsługuje sprzętu, system jest. Spróbuj strace bash(i zobacz, man stracejeśli nie wiesz, co to jest); po uruchomieniu basha pojawia się wstępna liczba połączeń. Teraz zacznij uderzać w klawisze:

read(0, "h", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "e", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "y", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0

Dla każdej wpisanej litery jest odczyt ze standardowego wejścia i zapis do standardowego wyjścia. Ale z czym jest związany standard powłoki? Teraz wypróbuj straceterminal GUI - jeśli nie znasz, musisz wymyślić nazwę, np. W KDE konsole, a GNOME ma gnome-terminal, jak sądzę. Wynik z tego stracejest prawdopodobnie bardziej tajemniczy - mój ma wiele poll()i recvfrom(). Nie widzę żadnych zapisów, ale jeśli teraz wyciągniesz catlewę z innego terminala, zauważysz, że podczas pisania, naciśnięcia klawiszy, które czytają cat, nie powodują żadnej odpowiedzi na wyjściu strace - terminal nie jest odbieram je. Tak więc aplikacja terminala GUI i cat rywalizują o odczyt z tego samego urządzenia, na którym wyprowadzana jest powłoka.

Złotowłosa
źródło
jaki jest pożytek z „cat / dev / pts / 4”, kiedy utkniemy i dlaczego utknęliśmy podczas wykonywania tego polecenia.
user2720323
Dodałem kilka akapitów, aby spróbować to wyjaśnić.
goldilocks