如何在Python中为变量分配系统命令

时间:2014-08-14 15:16:14

标签: python

我正在开发一个帮助我学习python的项目。我意识到我可能正在重新发明轮子,因为那里可能有一个ping模块。如果是这样,请不要建议,因为这个项目是为了帮助我学习python。

我不会详细介绍整个项目。目前,我只是尝试将ping命令的输出分配给变量。在大多数情况下,我只对ping输出的某个部分感兴趣。当地址存在时,代码工作正常。所以我的问题是如何解决这个问题,以便在网络地址不存在且ping返回否定结果时它可以正常工作?

 #! /usr/bin/perl
import subprocess

p1 = subprocess.check_output("ping -q -o -t 4 192.168.1.113", shell=True)

ping1 = p1[131:137]

print ping1

结果如下

>>> ================================ RESTART ================================
>>> 
 0.0% 
>>> 

当IP地址不存在时,我得到以下内容:

>>> ================================ RESTART ================================
>>> 

Traceback (most recent call last):
  File "/Users/dmartin/scripts/python/netscan/netscanv2.py", line 6, in <module>
    p1 = subprocess.check_output("ping -q -o -t 4 192.168.1.114", shell=True)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 575, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
CalledProcessError: Command 'ping -q -o -t 4 192.168.1.114' returned non-zero exit status 2

4 个答案:

答案 0 :(得分:2)

你应该抓住那个例外并以这种方式处理案件。

import subprocess

try:
  p1 = subprocess.check_output("ping -q -o -t 4 192.168.1.113", shell=True)
  ping1 = p1[131:137]
  print ping1
except CalledProcessError, e:
  if "status 2" in str(e):
    print "IP address does not exist."
  else:
    print "Process error encountered: " + str(e)

答案 1 :(得分:1)

检查手册页(man ping)。 Ping返回2表示ping已成功发送,但您没有收到回复。另请检查here here

尝试ping www.google.com 8.8.4.48.8.8.8)并查看是否有效。

答案 2 :(得分:0)

谢谢TheSoundDefense

尝试:除了:像魅力一样工作。我搜索其他论坛的算法,并决定放弃处理异常。我试过但我不明白如何为&#34; CalledProcessError&#34;创建一个例外。也许我会回到它的额外信贷。它也很有趣,因为我可以使用$ ping1 = ping -1 -o -t 192.168.113在perl中轻松搞定这个。我并不是想开始一场战争,但到目前为止,看起来python并不像perl那样对系统进行打击。现在,我将继续我的计划。我一开始并没有提到这个,但我正在创建一个通用的网络扫描仪。

答案 3 :(得分:0)

顺便说一下。以下是我在本文中收到的帮助下创建的程序副本。

#! /usr/bin/python
import commands

#ping -q -o -t 4 192.168.1.113

pingout = open('pingresults', 'a')


min = raw_input("Please enter minimum network range to be scanned ")
max = raw_input("please enter maximum network rant to be scanned ")

iplist = list(range(int(min),int(max)))

for ip in iplist:
     ipadrs = "192.168.2."+str(ip)


     #results = os.system("ping -q -o -t 4 ipadrs")
     #pingout.write(results)

     command_str = "ping -q -o -t 4 "+ipadrs+" | grep packets | awk -F \" \" \'{print $7}\' | awk -F \"\.\" \'{print $1}\'"

    output1 = commands.getoutput(command_str)
    output2 = int(output1)

    print ipadrs+" "+output1
    if output2 == 100:
        pingout.write(ipadrs+" No device is attached to this ip address\n ")

    else:
        pingout.write(ipadrs+" A device is attached to this ip address\n ")


pingout.close()