Управление TTY на Python

#python #linux #unix #tty #termios

#python #linux #unix #tty #termios

Вопрос:

Я предполагаю, что я не совсем понимаю, какова функция программ 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 и у кого есть объяснение, которым они хотели бы поделиться?

Спасибо, что ответили на мой основной вопрос 🙂

Ответ №1:

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

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

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

Комментарии:

1. os.setsid() — это все, что потребовалось! Я знал, что это должно быть легко. Спасибо.

Ответ №2:

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

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