Python TTY Control - PullRequest
       28

Python TTY Control

6 голосов
/ 06 мая 2011

Полагаю, мне не ясно, каковы функции программ getty / agetty / mgetty на машине linux / unix.Я могу запустить оболочку на tty примерно так:

TTY = '/dev/tty3'

cpid = os.fork()
if cpid == 0:
    os.closerange(0, 4)
    sys.stdin = open(TTY, 'r')
    sys.stdout = open(TTY, 'w')
    sys.stderr = open(TTY, 'w')
    os.execv(('/bin/bash',), ('bash',))

.. и, если я переключусь на tty3, будет запущена оболочка, но некоторые нажатия клавиш игнорируются / никогда не отправляются наракушка.оболочка знает, что настройки TTY неверны, потому что bash скажет что-то вроде «невозможно открыть tty, управление заданиями отключено»

Я знаю, что модуль «termios» имеет функции для изменения настроек TTY, чточто использует модуль 'tty', но я не могу найти пример того, как Python правильно устанавливает TTY и запускает оболочку.Я чувствую, что это должно быть что-то простое, но я не знаю, где искать.

поиск источника * etty программ не помог мне - C выглядит для меня как греческий: - /

Может быть, я просто не ищу правильные термины?Кто-нибудь в прошлом заменял * etty программы на Python и у них есть объяснение, которым они хотели бы поделиться?

Спасибо за интерес к моему основному вопросу:)

Ответы [ 2 ]

4 голосов
/ 06 мая 2011

Я вижу по крайней мере две вещи, которые вам не хватает - может быть больше:

Во-первых, вам нужно вызвать setsid() в дочернем процессе после закрытия старого стандартного ввода / стандартного вывода, иперед открытием нового TTY.Это делает две важные вещи: он делает ваш новый процесс лидером нового сеанса и отсоединяет его от своего предыдущего управляющего терминала (простого закрытия этого терминала недостаточно ).Это будет означать, что когда вы откроете новый tty, он станет управляющим терминалом, что вам и нужно.

Во-вторых, вам нужно установить переменную окружения TERM в соответствии с новым tty.

0 голосов
/ 06 мая 2011

Вам следует взглянуть на источник программ * tty *, чтобы увидеть, что они делают.

Я предполагаю, что они в основном запускают несколько команд ioctl для инициализации терминала в режиме, который обычно ожидают программы (например, для входа в систему и т. Д.). Однако некоторые из них могут также запрашивать имя пользователя (не пароль; логин делает это).

...