Элемент управления 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 делает это).