Найти - Пользователи
Полная версия: subprocess + socket
Начало » Python для новичков » subprocess + socket
1
kampella
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)), но нужно получить вывод команды.
Есть ли решение?
doza_and
kampella
Есть ли решение?
Конечно решение всегда есть.
Только у вас непонятно что происходит потому что вы код клиента не привели, ну или не выделили.
Rodegast
> нужно получить вывод команды.
vivod = subprocess.Popen([....], stdout=subprocess.PIPE).stdout.read()
kampella
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)
doza_and
kampella
это вывод от локально выполненной команды
Вы непонятно пишете. Локально на сервере или локально на клиенте.

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

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

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

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

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

Есть сервер и клиент. Я хочу чтобы сервер слушал порт, при подключении к этому порту клиента, отправлял клиенту shell команду и получал ответ этой команды в свой stdout,stderr.
Rodegast
> Ну так для чего тогда там 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
doza_and
kampella
подключении к этому порту клиента, отправлял клиенту shell команду
Ок read из сокета в клиенте команды. Потом нужен терминатор чтобы понять когда команда кончилась. потом subprocess.Popen на “Клиенте”. Ловите данные из выходного потока и пихаете в сокет. (может их и можно забиндить, но я не знаю как). Наверное надо помечать что из stdout и что из stderr. Ну или открыть 2 сокета. Ну и делаете write для получаемых на сервере данных. Правда это плохая идея. Ответы разных клиентов перепутаются.
kampella
Ну так для чего тогда там stdin аргумент?
этот вопрос ставит меня в тупик. Это то место откуда программа делает sys.stdin.read() или если угодно input. Это позволяет записать в файл данные а не набивать их постоянно на клавиатуре. ls помоему вообще stdin не использует.
kampella
doza_and
Всем спасибо. Почитал пару статей по subprocess, со всем разобрался. Думал, что команда запуска процессса должна уходить stdin, а оказалось там мы просто определяем канал для ввода для этого процесса.
doza_and
kampella
Думал, что команда запуска процессса должна уходить stdin
Между прочим вы почти правы. Для UNIX Команды которые выполняются системой попадают в stdin специального процесса - командного интерпретатора, он их читает и выполняет. Полностью аналогично запуску python в интерактивном режиме.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB