netstat.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #!/usr/bin/env python
  2. # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved.
  3. # Use of this source code is governed by a BSD-style license that can be
  4. # found in the LICENSE file.
  5. """
  6. A clone of 'netstat -antp' on Linux.
  7. $ python examples/netstat.py
  8. Proto Local address Remote address Status PID Program name
  9. tcp 127.0.0.1:48256 127.0.0.1:45884 ESTABLISHED 13646 chrome
  10. tcp 127.0.0.1:47073 127.0.0.1:45884 ESTABLISHED 13646 chrome
  11. tcp 127.0.0.1:47072 127.0.0.1:45884 ESTABLISHED 13646 chrome
  12. tcp 127.0.0.1:45884 - LISTEN 13651 GoogleTalkPlugi
  13. tcp 127.0.0.1:60948 - LISTEN 13651 GoogleTalkPlugi
  14. tcp 172.17.42.1:49102 127.0.0.1:19305 CLOSE_WAIT 13651 GoogleTalkPlugi
  15. tcp 172.17.42.1:55797 127.0.0.1:443 CLOSE_WAIT 13651 GoogleTalkPlugi
  16. ...
  17. """
  18. import socket
  19. from socket import AF_INET, SOCK_STREAM, SOCK_DGRAM
  20. import psutil
  21. AD = "-"
  22. AF_INET6 = getattr(socket, 'AF_INET6', object())
  23. proto_map = {
  24. (AF_INET, SOCK_STREAM): 'tcp',
  25. (AF_INET6, SOCK_STREAM): 'tcp6',
  26. (AF_INET, SOCK_DGRAM): 'udp',
  27. (AF_INET6, SOCK_DGRAM): 'udp6',
  28. }
  29. def main():
  30. templ = "%-5s %-30s %-30s %-13s %-6s %s"
  31. print(templ % (
  32. "Proto", "Local address", "Remote address", "Status", "PID",
  33. "Program name"))
  34. proc_names = {}
  35. for p in psutil.process_iter():
  36. try:
  37. proc_names[p.pid] = p.name()
  38. except psutil.Error:
  39. pass
  40. for c in psutil.net_connections(kind='inet'):
  41. laddr = "%s:%s" % (c.laddr)
  42. raddr = ""
  43. if c.raddr:
  44. raddr = "%s:%s" % (c.raddr)
  45. print(templ % (
  46. proto_map[(c.family, c.type)],
  47. laddr,
  48. raddr or AD,
  49. c.status,
  50. c.pid or AD,
  51. proc_names.get(c.pid, '?')[:15],
  52. ))
  53. if __name__ == '__main__':
  54. main()