2016-06-01 1 views
1

В настоящее время я запускаю эксперимент с Mininet-Wifi. Это CLI - это модуль Python Cmd, и я могу получить точную информацию о моделируемой сетевой среде. Симулятор работает как собственный процесс: sudo python на Ubuntu 14.04 или новее.Как подключить вход/вывод класса cmd класса Python к другому процессу Python?

Пульт дистанционного управления для этой сети - POX. На этот раз работает только скрипт; все автоматизировано с помощью предустановленных команд - не более человеческого взаимодействия. То, что я хотел бы сделать, это: процесс POX должен вводить команды в процесс Mininet и извлекать результаты выполнения этой команды. Это связано с тем, что логика POX должна постоянно запрашивать состояние сети через Mininet, чтобы иметь возможность принимать решения. Когда решение принято, POX должен снова ввести команду в процесс Mininet, чтобы изменить состояние сети.

ДОПОЛНЕНИЕ: В настоящее время, я только в состоянии получить доступ к хостам, которые порожденные Mininet, когда я бегу SUDO питона a_mininet_script, благодаря функции полезности называется м. После нереста хозяев Mininet вводит функцию CLI, с которой я хочу общаться, но не могу. Это функция Mininet's m.

#!/bin/bash 
# Attach to a Mininet host and run a command 

if [ -z $1 ]; then 
    echo "usage: $0 host cmd [args...]" 
    exit 1 
else 
    host=$1 
fi 

pid=`ps ax | grep "mininet:$host$" | grep bash | grep -v mnexec | awk '{print $1};'` 

if echo $pid | grep -q ' '; then 
    echo "Error: found multiple mininet:$host processes" 
    exit 2 
fi 

if [ "$pid" == "" ]; then 
    echo "Could not find Mininet host $host" 
    exit 3 
fi 

if [ -z $2 ]; then 
    cmd='bash' 
else 
    shift 
    cmd=$* 
fi 

cgroup=/sys/fs/cgroup/cpu/$host 
if [ -d "$cgroup" ]; then 
    cg="-g $host" 
fi 

# Check whether host should be running in a chroot dir 
rootdir="/var/run/mn/$host/root" 
if [ -d $rootdir -a -x $rootdir/bin/bash ]; then 
    cmd="'cd `pwd`; exec $cmd'" 
    cmd="chroot $rootdir /bin/bash -c $cmd" 
fi 

cmd="exec sudo mnexec $cg -a $pid $cmd" 
eval $cmd 

Например, для доступа к терминалу h1 с любого терминала, а не из сценария ЧО, я бы назвал это так:

sh m h1 ifconfig 

Но назвать его из подпроцесса было бы:

p = subprocess.Popen('echo my passwd | sudo -kS sh m h1 ifconfig', shell = True) 

чтобы повторить свой вопрос, я хочу общаться с CLI процесса Mininet от контроллера POX, а не только порожденных хостов.

ответ

0

Я думаю, вы хотите реализовать функцию что-то вроде netstat -oan | findstr 80 (это на окнах, чтобы найти порт 80), это команда конвейера для передачи вывода netstat -oan в команду findstr.

Затем код питона что-то вроде:

import subprocess 

p1 = subprocess.Popen('netstat -oan', stdout=subprocess.PIPE, shell=True) 
p2 = subprocess.Popen('findstr 80', stdin=p1.stdout, stdout=subprocess.PIPE, shell=True) 
pipeline_output = p2.communicate()[0] 
print pipeline_output 

Затем выходной процесс p1 будет передан процессу p2, FYI.

Смежные вопросы