Вопрос или проблема
(Я использую 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, так и для специалистов в области информационных технологий, желающих расширить свои знания о терминалах и виртуальных взаимодействиях.