Na tarde de sábado eu precisava pegar as portas abertas no servidor, da forma mais Real Time possível.  Primeira idéia? Naturalmente, foi parsear o resultado do netstat e ‘grepar’ o LISTEN ou OUÇA, mas depois imaginei que beber diretamente da fonte pudesse fazer o negócio andar mais rápido. Pesquisa daqui, pesquisa dali, aparentemente o netstat pega suas informações dos arquivos em /proc/net.

Após umas horinhas consegui o protótipo inicial do código que preciso. Mas durante a caminhada perdi o foco e acabei brincando um pouco mais com o /proc/net/tcp, no fim tinha um netstat simplificado feito em Python.

Então se alguém algum dia precisar recuperar informações de conexões ao estilo netstat aí está o código:

?View Code PYTHON
#!/usr/bin/python
 
# Criado por Ricardo Pascal, qualquer dúvida ou
# contribuição mande para  'pascal.linux' no gmail!
# Pode usar a vontade só lembre-se de citar a autoria ;)
# Agradecimento ao pessoal do #python-br na freenode.
# A galera lá sempre ajuda.
 
PROC_TCP = "/proc/net/tcp"
STATE = {
	    '01':'ESTABLISHED',
	    '02':'SYN_SENT',
	    '03':'SYN_RECV',
	    '04':'FIN_WAIT1',
	    '05':'FIN_WAIT2',
	    '06':'TIME_WAIT',
	    '07':'CLOSE',
	    '08':'CLOSE_WAIT',
	    '09':'LAST_ACK',
	    '0A':'LISTEN',
	    '0B':'CLOSING'
	}
 
tcp_FH = open(PROC_TCP,'r')
content = tcp_FH.readlines()
content.pop(0) # remove header
tcp_FH.close()
 
def hex2dec(s):
    return int(s,16)
 
def ip(s):
    return str(hex2dec(s[6:8])) +"."+ str(hex2dec(s[4:6])) +"."+ \
	    str(hex2dec(s[2:4])) +"."+ str(hex2dec(s[0:2]))
 
def remove_empty(list):
    return [x for x in list if x !='']
 
def get_list(c):
    result = []
    result.append(['ID','IP','PORT','rIP','rPORT','STATS'])
    for lines in content:
	line_array = remove_empty(lines.split(' '))
 
	line = [line_array[0], line_array[1].split(':'), \
		line_array[2].split(":"),line_array[3]]
 
	line = [line[0], ip(line[1][0]), hex2dec(line[1][1]), \
		ip(line[2][0]), hex2dec(line[2][1]), STATE[(line[3])]]
 
	result.append(line)
    return result
 
if __name__ == '__main__':
    for lines in get_list(content):
	print lines

PS. Quando eu tiver tempo eu refaço a cama de gato que ta ali na função get_list() e ip().

3 Responses to “Netstat em Python ou parsendo o /proc/net/tcp”

  1. tar -zxvf .com » Uso da CPU (por núcleo) em Python ou parseando o /proc/stat Says:

    [...] um post para a série “Parseando o /proc” [1]. Dessa vez sem motivo explícito, apenas [...]

  2. Segundo artigo da série: “Parseando o /proc” Says:

    [...] por Pascal (pascalΘtarzxvf·com): “Mês passado publiquei um código para parsear o /proc/net e para obter um resultado semelhante ao comando netstat. Dessa [...]

  3. Wesney Says:

    E ai blz.
    Gostaria de saber se você saber fazer um script Netstat, onde deverá trazer para a tela o resultado do comando “netstat –es” quando acionada.
    Se soube dar uma ajuda ai.
    Falow

Leave a Reply

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word