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

Вопрос или проблема

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

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

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

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

Обновление

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

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

Следующий код работает хорошо. Он выполняется на клиенте, а на сервере я получаю “hello”.

echo "hello" > /home/myhomefoler/pty_created_by_socat

В 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, независимо от того, используются ли они. На других устройствах узлы существуют только если псевдотерминал используется. Вы говорите, что используете Ubuntu, которая использует 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

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

Попробуйте утилиту screen. Например,

$ screen /dev/pts/5

Ответ или решение

Вопрос: Можно ли открыть терминал с заданным tty/pty?

В современной системе Linux, такой как Ubuntu, терминалы и псевдотерапии (pty) выполняют ключевую роль в взаимодействии между пользователем и системой. Вопрос использования определенных pty имеет множество нюансов, которые мы рассмотрим в этой статье.

1. Понимание TTY и PTY

TTY (teletypewriter) – это устаревший термин, относящийся к устройствам ввода-вывода, которые позволяют пользователям взаимодействовать с системой. В Linux tty обычно сильно варьируется: он может быть физическим (например, последовательный порт) или виртуальным (например, терминал, запускаемый в X-среде).

PTY (pseudo-terminal) – это виртуальный терминал, который позволяет взаимодействовать с программами, запускаемыми в терминале, путем перенаправления ввода-вывода. Он состоит из двух частей: master и slave. Master представляет собой интерфейс для программ (например, gnome-terminal), а slave – это интерфейс для взаимодействия с самой программой.

2. Создание нового PTY

В соответствии с архитектурой Linux, новые псевдотерапии создаются через специальный файл /dev/ptmx. Когда программа запрашивает новую pty, ядро автоматически выбирает коммуникационное устройство, которое не используется. Поэтому проконтролировать, какой именно pty будет назначен, невозможно – оно автоматическое.

Запустить терминал с конкретным pty, как, например, gnome-terminal /dev/pts/47, не получится, так как большинство терминал-эмуляторов не поддерживают возможность указания адреса pty. Это связано не только с архитектурными особенностями, но и с безопасностью, что предотвращает программы от неоправданного доступа к системным ресурсам.

3. Использование socat

Выражая намерение использовать socat для настройки удаленного доступа к терминалу, вы на верном пути. socat – это мощное средство для соединения потоков данных. Вы можете воспользоваться им для создания виртуального терминала и подключения к нему:

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

Этот код создает соединение TCP на порту 2222, через которое можно будет получить доступ к терминалу. Обратите внимание: это небезопасно, если ваш сервер доступен извне без дополнительных мер безопасности.

4. Альтернативные опции

Для временного доступа к удаленному сеансу, аналогично socat, вы также можете использовать инструменты типа screen или tmux. Например:

screen /dev/pts/5

Это позволит вам создать новый сеанс и управлять несколькими терминалами одновременно.

5. Зачем так много tty и pty?

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

Заключение

Принимая во внимание все вышесказанное, ответ на ваш вопрос о возможности открытия терминала с заданным pty – отрицательный. Из-за стандартизированных процессов создания pty в системе Linux вы не можете задать конкретный номер. Однако, используя socat или другие аналогичные инструменты, вы можете эффективно создавать и управлять pty-сеансами, что, в свою очередь, открывает новые возможности для управления виртуальными терминалами.


Эта информация будет полезна как для тех, кто работает с системами Linux, так и для специалистов в области информационных технологий, желающих расширить свои знания о терминалах и виртуальных взаимодействиях.

Оцените материал
Добавить комментарий

Капча загружается...