#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).