在Ubuntu中用Python 2.7读取os.system()命令的输出
我在Ubuntu 11.4和Python 2.7上运行的代码大概是这样的:
p_scan_command = "sudo nmap -sC -sV -PN -O 192.168.0.1/24"
time.sleep(1.5)
os.system(p_scan_command)
f = open('nmapscan1.log', 'r')
print f.read()
f.close()
结果是我没有得到任何结果,扫描没有执行,可能是因为它是用'sudo'命令运行的。我想知道:
- 我对问题的判断是否正确,以及
- 该怎么解决这个问题?
2 个回答
0
- 你可以在Python中使用
commands
模块。 - 你也可以使用
subprocess
模块。
主要的问题是,当你在python
程序里使用sudo
命令时,它不会要求输入密码,所以最好直接运行sudo python filename.py
。
7
你确定日志文件真的创建了吗?我看不到这个名字在哪里提到过——不过也许它是默认创建的。
你有没有被
sudo
要求输入密码?这可以告诉你是否真的在运行sudo
。os.system
这个方法有点过时了,或者说不太推荐使用;最好用subprocess.call()
、subprocess.check_call()
或者subprocess.Popen()
(这个可以给你一个对象,你可以用它来进一步控制进程)。
编辑:刚刚测试了一下。在这里扫描是运行的,但输出显示在屏幕上,而不是写入文件。可能是你在 os.system()
调用中缺少了 > nmapscan1.log
这一部分。
如果用 subprocess
,你可以这样写:
sp = subprocess.Popen(['sudo', 'nmap', '-sC', '-sV', '-PN', '-O', '192.168.0.1/24'],
stdout=file("nmapscan1.log", "w"))
sp.wait()
f = open('nmapscan1.log', 'r')
print f.read()
f.close()
或者如果你不需要文件,简单地:
sp = subprocess.Popen(['sudo', 'nmap', '-sC', '-sV', '-PN', '-O', '192.168.0.1/24'],
stdout=subprocess.PIPE)
print sp.stdout.read()
sp.wait()