Skip to content

Instantly share code, notes, and snippets.

@jordemort
Created June 14, 2018 17:26
Show Gist options
  • Save jordemort/81761e1c9cd938a9963f036356c697cf to your computer and use it in GitHub Desktop.
Save jordemort/81761e1c9cd938a9963f036356c697cf to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
# Print everything that's listening on 127.0.0.1 but not ::1 or
# listening on 0.0.0.0 but not ::
v4_to_v6 = { "127.0.0.1" => "::1", "0.0.0.0" => "::"}
sockets = {}
IO.popen('sudo ss -Hnlp -A tcp,udp') do |ss|
while (line = ss.gets) do
fields = line.split
proto = fields[0]
local = fields[4].split(':')
port = local.pop.to_i
addr = local.join(':')
addr = addr == '*' ? '0.0.0.0' : addr
service = 'unknown'
if fields.length > 6 then
if m = fields[6].match(/pid=(\d+)/) then
pid = m.captures[0]
service = `systemctl status #{pid}`.split("\n")[0].split(' ')[1]
end
end
unless sockets.key? addr ; sockets[addr] = {} end
unless sockets[addr].key? proto ; sockets[addr][proto] = {} end
sockets[addr][proto][port] = service
end
end
v4_to_v6.keys.sort.each do |v4|
v6 = v4_to_v6[v4]
sockets[v4].keys.sort.each do |proto|
sockets[v4][proto].keys.sort.each do |port|
unless sockets.key?(v6) && sockets[v6].key?(proto) && sockets[v6][proto].key?(port)
puts "#{sockets[v4][proto][port]} listening on #{v4}:#{port} but not #{v6}"
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment