LINUX.ORG.RU

интерактивный bash из python

 ,


0

1

Доброго времени суток! Изучаю питон, попутно пишу всякие полезные скрипты. Подскажите, как с помощью subprocess сделать посредника между интерактивным башем и терминалом? То есть запускается питоновская программа, вызывающая баш, и передает в баш ввод пользователя (построчно), читает результат и возвращает пользователю? Спасибо.

А вам обязательно нужна конструкция с «посредником»? Если вам не нужно ничего делать со вводом и выводом, может быть вас устроит результат

import subprocess
subprocess.call("bash")

(Там нет никакого перехвата, bash просто наследует stdin/stdout/stderr вашей программы).

LeninGad ()

Я нифига не понял.

import subprocess
import sys

p = subprocess.Popen(['bash'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
p.stdin.write('echo hello'.encode())
p.stdin.close()
sys.stdout.write(p.stdout.read().decode())
p.kill()

=> hello

anonymous ()

Предполагаю, что описанные функции лежат в основе Pexpect

vitalyisaev2 ()
Ответ на: комментарий от anonymous

надо чтобы команды выполнялись в одной и той же оболочке bash. Пример анонимуса работает с одной командой, а как выполнить несколько? суть в том, чтобы работать с этой прогой можно было как с башем.

antropos ()
Ответ на: комментарий от antropos

Если нужен всё-таки перехват, тогда pexpect:

import pexpect
child = pexpect.spawn("bash")
child.interact()

Но см. выше, для того чтобы дать пользователю поработать с bash достаточно subprocess.call().

LeninGad ()
Ответ на: комментарий от LeninGad

LeninGad, спасибо, почти то что надо. interact привязывает child к терминалу, и в питоньем коде их не получится ни посмотреть, ни изменить. Есть ли способ считывать команды построчно, например, в raw_input, и отправлять их по мере поступления в bash?

antropos ()
Ответ на: комментарий от antropos

С изменением будет трудно: у нас пользователь с bash общается через readline. Если мы передадим interact свой input_filter, мы увидим «клавишу за клавишей» действия по редактированию строки, но не увидим окончательной строки (ещё bash completion учтите).

Советую поделиться вышестоящей надзадачей — «проверять и ограничивать пользователя» это к rbash/bash -r, например. А честную проверку команды с модификацией я бы делал на preexec (чтобы bash нам через сокет говорил, что собирается выполнить, и получал ответ), но это муторно и громоздко.

LeninGad ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.