Можно ли открыть терминал с указанным tty / pty

9

(Я использую Ubuntu.) В моем понимании tty - это просто своего рода порт. Вы вводите что-то, и оно должно что-то выводить. А терминал (эмулятор) - это программный дескриптор этих входов и выходов. Буквально терминал может выбрать, к какому порту подключаться.

Я видел много tty-файлов в / dev и много pts-файлов в / dev / pts / Я не знаю, почему их так много. Они все используются?

Если нет, могу ли я запустить терминал с указанным pty?

например gnome-terminal /dev/pts/47

Обновить

Я делаю это потому, что хочу иметь удаленный терминал. Я знаю, что подходящим подходом является использование ssh или telnet.

Но для временного доступа это не очень удобно. Я хочу использовать socat для передачи tty или pty клиенту. Затем клиент может запустить терминал с этим pty или tty.

Следующий код работает нормально. Это выполняется на клиенте, и на стороне сервера я получаю "привет".

echo "hello" > /home/myhomefoler/pty_created_by_socat
worldterminator
источник

Ответы:

9

В UNIX tty (как и многие другие) отображается в виде файла. Данные, записанные на tty-устройство, поступают на терминал, а данные, поступающие с терминала, доступны для чтения на tty.

Если tty является аппаратным последовательным портом, то записанные в него данные отправляются по проводам, а данные, поступающие по проводам, появляются на tty.

Если tty - это видео-консоль машины, то записанные в нее данные отображаются на экране, а данные, поступающие с клавиатуры, появляются на tty.

Если tty является псевдо-tty (виртуальным терминалом), подключенным к эмулятору X-терминала, например, gnome-terminalтогда записанные в него данные доставляются в программное обеспечение эмулятора X-терминала и, в свою очередь, отображаются в окне, а данные, введенные в это окно, доступны. для чтения на виртуальном терминале. Говорят, что программное обеспечение подключено к «главному» концу псевдотерминала. Реальные терминалы не имеют «главного» конца, потому что за ними находится реальное устройство (например, последовательный порт), а не виртуальное устройство, реализованное программным обеспечением.

Таким образом, вы уже можете видеть, что не имеет смысла просить эмулятор терминала X работать на произвольном tty-устройстве, таком как /dev/ttyS0(настоящий последовательный порт в Linux). Это должно быть псевдо-tty.

Но может ли эмулятор терминала выбрать числовой идентификатор используемого им псевдотерминального устройства? В принципе, ядро ​​могло бы разрешить это, но на самом деле интерфейс ядра для выделения нового псевдотерминала не поддерживает его: ядро ​​делает свой выбор. (В модели SysV псевдо-терминалы создаются путем открытия специального устройства, называемого /dev/ptmxпсевдо-терминалом, и автоматически выделяется доступное устройство с наименьшим номером.)

Но: зачем вам нужно выбирать номер псевдотерминального устройства, которое будет выделено? Ядро выбирает неиспользованное, которое гарантированно будет доступно и пригодно для использования. У вас есть причина, по которой вы бы предпочли, если бы она выбрала другую?

Что касается вас, то другой вопрос:

Я видел много tty-файлов в / dev и много pts-файлов в / dev / pts / Я не знаю, почему их так много. Они все используются?

Это зависит от системы. В некоторых системах все возможные псевдотерминальные устройства заранее созданы /dev/ptsили /devнезависимо от того, используются они или нет. В других случаях узлы устройства существуют только в том случае, если псевдо-терминал используется. Вы говорите, что используете Ununbu, который использует Linux, который является последним типом. Итак, да, все узлы устройств, которые вы видите, в /dev/ptsнастоящее время используются.

Но для временного доступа это не очень удобно. Я хочу использовать socat для передачи tty или pty клиенту. Затем клиент может запустить терминал с этим pty или tty.

Если вы хотите, чтобы socatкакое-либо другое программное обеспечение было подключено к главному концу псевдотерминала, вам необходимо, чтобы это программное обеспечение специально поддерживало это. Но вам повезло, потому что socatэто так. Например, если я бегу:

socat PTY,link=/tmp/socat.pty TCP-LISTEN:2222 &
sleep 1 && ( setsid bash ) </tmp/socat.pty >/tmp/socat.pty 2>&1

Я могу получить оболочку, подключившись к порту 2222 откуда-то еще. Очень опасно с точки зрения безопасности !!!

Celada
источник