Netstat em Python ou parsendo o /proc/net/tcp
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().
[...] um post para a série “Parseando o /proc” [1]. Dessa vez sem motivo explícito, apenas [...]
[...] 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 [...]
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