associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

UnixLinuxComandosWeb

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.