Esse aqui é um pequeno CGI que permite a execução de alguns comandos Linux/Unix via Web. Ele não se preocupa muito com aspectos de segurança e afins, portanto, certifique-se que isso não possa lhe causar problemas.
Para esse código funcionar é só ter um servidor Web rodando com permissão para executar CGI. Além disso você precisará do Python (lógico), Nmap, Traceroute e do Ping. Ele também funciona apenas em sistemas Unix-like e serve para demonstrar alguns macetes sobre algumas chamadas do sistema.
Eu utilizei esse método no lugar do os.popen() pois quando o CGI 'morre' (cliente clica no 'Parar' do navegador) o processo filho também morre. Com o os.popen() isso não aconteceria.
Código
1 #!/usr/bin/env python
2
3 import os
4 import sys
5 import cgi
6 import re
7
8 def header():
9 print """<html>
10 <head>
11 <title>WebCommands</title>
12 </head>
13 <body>"""
14
15 def valid_ip(ip):
16 return re.match('([0-9]{1,3}\.){3}[0-9]{1,3}', ip)
17
18 def main():
19 header()
20 body()
21 footer()
22
23 def body():
24 form = cgi.FormContentDict()
25
26 print '<h1>Host</h1>'
27 print '<form method="get">'
28 if form.has_key('ip'):
29 ip = form.dict['ip'][0]
30 print '<p>IP: <input type="text" name="ip" value="%s"></p>' % (ip)
31 else:
32 print '<p>IP: <input type="text" name="ip"></p>'
33 print '<p>'
34 print '<input type="submit" name="command" value="Ping">'
35 print '<input type="submit" name="command" value="Traceroute">'
36 print '<input type="submit" name="command" value="NMap">'
37 print '</form>'
38
39 if not valid_ip(ip):
40 print "<p>Error: invalid ip address</p>"
41 return
42
43 if form.has_key('command'):
44 print "<h1>Command Result</h1>"
45 if not do_command(form.dict['command'][0].lower(), ip):
46 print "<p class='error'>Error: invalid command</p>"
47 return
48
49 def footer():
50 print "</body>"
51 print "</html>"
52
53 def do_command(cmd, ip):
54 print "teste"
55 if cmd == 'ping':
56 p = '/bin'
57 c = 'ping'
58 elif cmd == 'traceroute':
59 p = '/usr/sbin'
60 c = 'traceroute'
61 elif cmd == 'nmap':
62 p = '/usr/bin'
63 c = 'nmap'
64 else:
65 return 0
66
67 try:
68 pid, fd = os.forkpty()
69 except:
70 sys.stderr.write("cannot fork()\n")
71 sys.exit(1)
72
73 if pid == 0:
74 os.execv("%s/%s" % (p, c), [c] + [ip])
75 sys.exit(0)
76
77 print "<pre>"
78 buffer = ""
79 while 1:
80 try:
81 data = os.read(fd, 32)
82 except:
83 break
84
85 buffer = buffer + data
86 res = buffer.split("\n", 1)
87
88 if len(res) != 2:
89 continue
90
91 line, buffer = res
92
93 line = line.strip()
94 print "%s" % (line)
95 sys.stdout.flush()
96
97 print "</pre>"
98
99 os.close(fd)
100
101 return 1
102
103 if __name__ == '__main__':
104 print "Content-type: text/html\n"
105 main()
Volta para CookBook.