在Ubuntu中用Python 2.7读取os.system()命令的输出

2 投票
2 回答
1403 浏览
提问于 2025-04-16 23:59

我在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'命令运行的。我想知道:

  1. 我对问题的判断是否正确,以及
  2. 该怎么解决这个问题?

2 个回答

0
  1. 你可以在Python中使用commands模块。
  2. 你也可以使用subprocess模块。

主要的问题是,当你在python程序里使用sudo命令时,它不会要求输入密码,所以最好直接运行sudo python filename.py

7
  1. 你确定日志文件真的创建了吗?我看不到这个名字在哪里提到过——不过也许它是默认创建的。

  2. 你有没有被 sudo 要求输入密码?这可以告诉你是否真的在运行 sudo

  3. 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()

撰写回答