Форум сайта python.su
1
def run_command(command, fsock): try: output = subprocess.Popen(command, stdin=fsock, stderr=fsock, stdout=subprocess.PIPE, shell=True).communicate() except: output = 'Failed to execute command.\r\n' return output command = 'ls -la' client_socket, addr = server.accept() run_command(command, client_socket) fsock = client_socket.makefile('wb') run_command(command, fsock)
Отредактировано kampella (Авг. 17, 2015 01:53:55)
Офлайн
253
kampellaКонечно решение всегда есть.
Есть ли решение?
Офлайн
186
> нужно получить вывод команды.
vivod = subprocess.Popen([....], stdout=subprocess.PIPE).stdout.read()
Офлайн
1
Rodegastэто вывод от локально выполненной команды
> нужно получить вывод команды.

import socket,os s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(("11.22.33.44",9900)) os.dup2(s.fileno(),0) os.dup2(s.fileno(),1) os.dup2(s.fileno(),2)
Отредактировано kampella (Авг. 17, 2015 12:33:12)
Офлайн
253
kampellaВы непонятно пишете. Локально на сервере или локально на клиенте.
это вывод от локально выполненной команды
Отредактировано doza_and (Авг. 17, 2015 19:17:30)
Офлайн
1
doza_andЛокально на сервере.
Локально на сервере или локально на клиенте.
doza_andНу так для чего тогда там stdin аргумент?
Очевидно subprocess.Popen надо запускать на той машине где вы хотите сделать свой ls.
doza_and
“Есть N машин. одна из них сервер. Я хочу чтобы клиенты могли отправлять серверу shell команды, содержимое потока stdin для них и получать в ответ содержимое stdout,stderr.”
Офлайн
186
> Ну так для чего тогда там stdin аргумент? … отправлял клиенту shell команду и получал ответ этой команды в свой stdout,stderr.
Как бы тебе ответить что-бы ты не очень обиделся… Короче учи матчасть
https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D1%8B%D0%B5_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B8
Офлайн
253
kampellaОк read из сокета в клиенте команды. Потом нужен терминатор чтобы понять когда команда кончилась. потом subprocess.Popen на “Клиенте”. Ловите данные из выходного потока и пихаете в сокет. (может их и можно забиндить, но я не знаю как). Наверное надо помечать что из stdout и что из stderr. Ну или открыть 2 сокета. Ну и делаете write для получаемых на сервере данных. Правда это плохая идея. Ответы разных клиентов перепутаются.
подключении к этому порту клиента, отправлял клиенту shell команду
kampellaэтот вопрос ставит меня в тупик. Это то место откуда программа делает sys.stdin.read() или если угодно input. Это позволяет записать в файл данные а не набивать их постоянно на клавиатуре. ls помоему вообще stdin не использует.
Ну так для чего тогда там stdin аргумент?
Отредактировано doza_and (Авг. 17, 2015 23:42:07)
Офлайн
1
doza_andВсем спасибо. Почитал пару статей по subprocess, со всем разобрался
. Думал, что команда запуска процессса должна уходить stdin, а оказалось там мы просто определяем канал для ввода для этого процесса.
Отредактировано kampella (Авг. 18, 2015 01:33:47)
Офлайн
253
kampellaМежду прочим вы почти правы. Для UNIX Команды которые выполняются системой попадают в stdin специального процесса - командного интерпретатора, он их читает и выполняет. Полностью аналогично запуску python в интерактивном режиме.
Думал, что команда запуска процессса должна уходить stdin
Офлайн