【问题标题】:How to run a Mininet CLI command from inside python module如何从 python 模块内部运行 Mininet CLI 命令
【发布时间】:2022-05-04 20:18:44
【问题描述】:

我写了一个python模块,使用Mininet生成随机拓扑,并连接了OpenDayLight作为遥控器。

我想将命令传递给 mininet CLI,但来自 python 模块内部。生成主机和交换机并连接到遥控器后,模块随机选择2台主机作为Server和Client。 我在做与此类似的事情时遇到了麻烦,但是来自 python 模块内的内联:

mininet> h<random_number> sudo python HTTPTraffic.py <SrcIP> <DstIP>

HTTPTraffic.py 是另一个接受参数SrcIP 和DstIP 的模块

这是主模块的一部分,它选择 2 个随机主机并获取它们的 IP。我想让HTTPTraffic.py在SrcIP对应的主机上运行

Nodes = list(range(1,h))
Src = random.choice(Nodes)         # randomly chooses 1 host
Nodes.remove(Src)
Dst = random.choice(Nodes)         # randomly chooses another host

SrcName = 'h%s' %(Src)
DstName = 'h%s' %(Dst)
SrcNode=net.get(SrcName)
DstNode=net.get(DstName)

SrcIP = SrcNode.IP()               # IP retrieval of chosen hosts
DstIP = DstNode.IP()
print ('The Souce/Client is: '+ SrcName)
print (SrcIP)
print ('The Destination/Server is: '+ DstName)
print (DstIP) 

SrcName +".cmd('sudo python HTTPTraffic.py "+SrcIP+" " +DstIP+"')"    # this is where I am having trouble

来自mininet API documentation(请参阅“自定义网络”部分),类似的事情是可能的,但我在做这件事时遇到了很多麻烦。另外,我希望这个命令在主程序运行时在后台运行。任何反馈都表示赞赏。

【问题讨论】:

  • 我在再次阅读您的问题后才意识到这一点,看来我的建议并没有真正回答您的问题。它看起来像做你想做的事,你会想使用 mininet API 代替,因为 mininet CLI 是一个交互式终端。

标签: python command-line-interface background-process mininet


【解决方案1】:

我建议您查看 Python 模块 subprocess 的文档,该模块充当与平台无关的 API,用于从您的程序运行其他程序。

例如,您可以通过在代码中添加以下行来调用ls:

subprocess.run(["ls", "-l"])

run 的第一个参数接受一个字符串数组,其中每个字符串都是您正在执行的命令的一部分。

【讨论】:

  • 其实这不是我想要的。我的主要问题是如何将命令从 python 传递到 Mininet CLI。您的建议可能是回答我的第二个问题,即在后台运行它。我仍然想在找到第一个问题的解决方案后立即尝试。
  • 看看this SO问答,并阅读一些cmets。有一种方法可以使用 subprocess.Popen 在 python 中包装交互式 CLI。本质上,您将使用Popen 调用sudo mn,并使用proc.stdin.write("command string") 向其传递命令,并使用line = proc.stdout.readline() 读取mininet 的输出。
  • 我尝试按照您的建议使用subprocess,但它将命令传递给 Linux CLI 而不是 mininet CLI。你提到使用 Popen 调用sudo mn,你能提供一个例子吗?此外,代码似乎在传递包含超过 1 个单词的命令时存在问题。不幸的是,shlex.split 没有做到这一点。
  • 好的,它看起来有点像这样:proc = subprocess.Popen(['sudo', 'mn'], stdout=subprocess.PIPE, stdin=subprocess.PIPE) 然后您将使用proc.stdin.write 方法将命令传递给 mininet。然后您可以使用proc.stdout.readline() 读取结果。
【解决方案2】:

你应该像这样构建一些东西:

n=3
for i in range(4):
    user_input = 'h' + str(n)
    globals()[user_input] = net.addHost('h'+ str(n), cls=Host, ip='10.0.1.2'+ str(n) +'/24', defaultRoute='via 10.0.1.1')
    net.addLink(globals()[user_input],s6)
    n += 1

【讨论】:

  • 请在您的示例代码中添加更多注释以演示正在发生的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2018-01-08
  • 2019-07-27
相关资源
最近更新 更多