Элемент управления Python TTY

думаю, я не совсем понимаю, что такое функция программ 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", но я не могу найти пример правильной настройки tty python и запуска оболочки. Я чувствую, что это должно быть что-то простое, но я не знаю, где искать.

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

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

Спасибо за развлекательный мой основной вопрос:)

2 ответов


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

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

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


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

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