LINUX.ORG.RU

Как заставить tty+xterm отображать приглашение ввода после выполнения «удаленной» команды?

 , , , ,


1

1

Есть tty-терминал, пусть это будет /dev/pts/25. В нем запущен xterm.

Находясь в другой консоли, можно выполнить команду так, что результат ее работы отразится в /dev/pts/25. Например, для получения списка файлов можно выполнить:

(ls) </dev/pts/25 >/dev/pts/25 2> /dev/pts/25
Но тут есть проблема. После выполнения такой команды, в /dev/pts/25 не появляется приглашение ввода. А нужно, чтоб появлялось.

Другими словами, после выполнения такой «удаленной» команды приходится переключаться на окно терминала /dev/pts/25, нажимать «Enter» и только тогда появляется приглашение ввода.

Важное замечание: Утилиты xdotool в системе нет и не предвидится. Автоматизация делается через python 3.5, но библиотеки python-xlib в системе нет и не предвидится.

★★★★★

Ответа на вопрос не знаю, но вот по этому поводу:

втоматизация делается через python 3.5, но библиотеки python-xlib в системе нет и не предвидится.

https://docs.python.org/3/library/ctypes.html

Через ctypes можно дёрнуть почти любую системную библиотеку, насколько я понимаю. Да, это будет сложно и неэффективно, и удаление гланд через неправильное место, но если система закрытая и огороженная, то может оказаться единственным выходом.

emorozov
()

Есть tty-терминал, пусть это будет /dev/pts/25. В нем запущен xterm.

Непонятное заявление. Может быть, ты хотел сказать что у тебя запущен, для примера, xterm, который создал себе виртуальный терминал /dev/pts/25, а в терминале запущен шелл? Потому что если в терминале запущен xterm (как ты написал), то никаких приглашений в нём не будет - он занят выполняющейся прогой.

Другими словами, после выполнения такой «удаленной» команды приходится переключаться на окно терминала /dev/pts/25, нажимать «Enter» и только тогда появляется приглашение ввода.

echo "" >> /dev/pts/25
echo -n "\$ " >> /dev/pts/25

Если ты хотел чтобы приглашение вывел шелл, запущеный в терминале, то тебе как-то надо послать enter ему на stdin. Имени /dev/pts/25 для этого кардинально недостаточно, слать надо с другого конца (из xterm-а), а как его найти и как в него внедриться (этот самый другой конец есть в виде открытого дескриптора в процессе xterm, но в виде файла в dev его нет) - отдельная задача.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Непонятное заявление. Может быть, ты хотел сказать что у тебя запущен, для примера, xterm, который создал себе виртуальный терминал /dev/pts/25, а в терминале запущен шелл?

Чтоб было понятнее, покажу код. В переменной wid - идентификатор окошка X11.

# Получение tty с которым будет работать терминал
os.system('xterm -into %d -geometry 160x50 -sb -e "tty > /tmp/pyguitty.txt"' % wid)
fp=open('/tmp/pyguitty.txt', 'r')
ttyDevice=fp.readline().strip();
fp.close();
print("tty info: "+ttyDevice)

# Открытие терминала с шеллом. Перед запуском шелла выводится рабочий tty
os.system('xterm -into %d -geometry 160x50 -sb -e "tty; sh" &' % wid)

А вот как выполняются команды в этом терминале:
    tty=ttyDevice
    print('tty: '+tty)

    command=commandEntry.get()
    print('Command: '+command)

    # Вывод в терминал строки команды, которая будет выполняться
    cmdLine="echo %s <%s >%s 2> %s" % (escapeString(command), tty, tty, tty)
    print('Echo line:')
    print(cmdLine)
    os.system(cmdLine)

    # Выполнение команды в терминале
    cmdLine="(%s) <%s >%s 2> %s" % (command, tty, tty, tty)
    print('Command line:')
    print(cmdLine)
    os.system(cmdLine)


Полный код: https://pastebin.com/kVrp0KY4

В системе должны быть установлены python3, tcl/tk, tkinter.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от adn

А какую проблему то решаешь?

Полный код примера привел выше.

Может достаточно screen/tmux в этом xterm-е запустить и потом просто через него работать?

Что имеешь в виду? Отправлять команды через screen/tmux-сервер?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Чтоб было понятнее, покажу код. В переменной wid - идентификатор окошка X11.

Ну да, это pts/25 в xterm-е, а не наоборот.

А вот как выполняются команды в этом терминале:

Это тоже всё понятно. Но зачем такие извращения? И учти что если во время выполнения твоей псевдокоманды юзер нажмёт enter в том окне - там тоже появится промпт шелла в середине вывода.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от adn

Все хорошо за исключением того, что в моем дистре Astra Linux 1.6 CE утилиты tmux просто нет. Я могу конечно от дебы поставить, но другие пользователи разрабатываемого костыля установить таковое не смогут, им нативное все подавай.

Xintrea ★★★★★
() автор топика