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:
#!/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().


July 9th, 2009 at 1:31 am
[...] um post para a série “Parseando o /proc” [1]. Dessa vez sem motivo explícito, apenas [...]
July 11th, 2009 at 5:00 pm
[...] 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 [...]
November 17th, 2009 at 9:40 am
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