{"id":13878787,"url":"https://github.com/postmodern/ruby-masscan","last_synced_at":"2025-03-16T19:33:10.222Z","repository":{"id":56893559,"uuid":"400836470","full_name":"postmodern/ruby-masscan","owner":"postmodern","description":"A Ruby interface to masscan, an Internet-scale port scanner.","archived":false,"fork":false,"pushed_at":"2024-06-23T09:41:55.000Z","size":93,"stargazers_count":11,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-02-27T12:45:32.843Z","etag":null,"topics":["command-mapper","infosec","masscan","masscan-parse","ruby"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/postmodern.png","metadata":{"files":{"readme":"README.md","changelog":"ChangeLog.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-08-28T16:14:04.000Z","updated_at":"2024-10-14T04:06:38.000Z","dependencies_parsed_at":"2024-10-27T11:12:14.786Z","dependency_job_id":null,"html_url":"https://github.com/postmodern/ruby-masscan","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/postmodern%2Fruby-masscan","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/postmodern%2Fruby-masscan/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/postmodern%2Fruby-masscan/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/postmodern%2Fruby-masscan/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/postmodern","download_url":"https://codeload.github.com/postmodern/ruby-masscan/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243826798,"owners_count":20354221,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["command-mapper","infosec","masscan","masscan-parse","ruby"],"created_at":"2024-08-06T08:01:59.986Z","updated_at":"2025-03-16T19:33:09.971Z","avatar_url":"https://github.com/postmodern.png","language":"Ruby","funding_links":[],"categories":["Ruby"],"sub_categories":[],"readme":"# ruby-masscan\n\n[![CI](https://github.com/postmodern/ruby-masscan/actions/workflows/ruby.yml/badge.svg)](https://github.com/postmodern/ruby-masscan/actions/workflows/ruby.yml)\n[![Gem Version](https://badge.fury.io/rb/ruby-masscan.svg)](https://badge.fury.io/rb/ruby-masscan)\n\n* [Source](https://github.com/postmodern/ruby-masscan/)\n* [Issues](https://github.com/postmodern/ruby-masscan/issues)\n* [Documentation](http://rubydoc.info/gems/ruby-masscan/frames)\n\n## Description\n\nA Ruby interface to [masscan], an Internet-scale port scanner.\nAllows automating masscan and parsing masscan Binary, List, and JSON output\nfile formats.\n\n## Features\n\n* Provides a [Ruby interface][Masscan::Command] for running the `masscan`\n  utility.\n* Supports [parsing][Masscan::OutputFile] masscan Binary, List, and JSON output\n  files.\n\n[Masscan::Command]: https://rubydoc.info/gems/ruby-masscan/Masscan/Command\n[Masscan::OutputFile]: https://rubydoc.info/gems/ruby-masscan/Masscan/OutputFile\n\n## Examples\n\nRun `sudo masscan` from Ruby:\n\n```ruby\nrequire 'masscan/command'\n\nMasscan::Command.sudo do |masscan|\n  masscan.output_format = :list\n  masscan.output_file   = 'masscan.txt'\n\n  masscan.ips   = '192.168.1.1/24'\n  masscan.ports = [20,21,22,23,25,80,110,443,512,522,8080,1080]\nend\n```\n\nParse a `masscan` output file and guess the format:\n\n```ruby\nrequire 'masscan/output_file'\n\noutput_file = Masscan::OutputFile.new('masscan.txt')\noutput.format\n# =\u003e :list\n```\n\nParse `masscan` Binary output files:\n\n```ruby\noutput_file = Masscan::OutputFile.new('masscan.scan', format: :binary)\noutput_file.each do |record|\n  p record\nend\n```\n\n```\n#\u003cstruct Masscan::Status status=:open, protocol=:tcp, port=80, reason=[:syn, :ack], ttl=54, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-26 16:07:33 -0700, mac=nil\u003e\n#\u003cstruct Masscan::Status status=:open, protocol=:tcp, port=443, reason=[:syn, :ack], ttl=54, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-26 16:07:33 -0700, mac=nil\u003e\n#\u003cstruct Masscan::Status status=:open, protocol=:icmp, port=0, reason=[], ttl=54, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-26 16:07:33 -0700, mac=nil\u003e\n#\u003cstruct Masscan::Banner protocol=:tcp, port=443, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-26 16:07:35 -0700, app_protocol=:ssl3, payload=\"TLS/1.1 cipher:0xc013, www.example.org, www.example.org, example.com, example.edu, example.net, example.org, www.example.com, www.example.edu, www.example.net\"\u003e\n#\u003cstruct Masscan::Banner protocol=:tcp, port=443, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-26 16:07:35 -0700, app_protocol=:x509_cert, payload=\"MIIG1TCCBb2gAwIBAgIQD74IsIVNBXOKsMzhya/uyTANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSkwJwYDVQQDEyBEaWdpQ2VydCBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTAeFw0yMDExMjQwMDAwMDBaFw0yMTEyMjUyMzU5NTlaMIGQMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEUMBIGA1UEBxMLTG9zIEFuZ2VsZXMxPDA6BgNVBAoTM0ludGVybmV0IENvcnBvcmF0aW9uIGZvciBBc3NpZ25lZCBOYW1lcyBhbmQgTnVtYmVyczEYMBYGA1UEAxMPd3d3LmV4YW1wbGUub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuvzuzMoKCP8Okx2zvgucA5YinrFPEK5RQP1TX7PEYUAoBO6i5hIAsIKFmFxtW2sghERilU5rdnxQcF3fEx3sY4OtY6VSBPLPhLrbKozHLrQ8ZN/rYTb+hgNUeT7NA1mP78IEkxAj4qG5tli4Jq41aCbUlCt7equGXokImhC+UY5IpQEZS0tKD4vu2ksZ04Qetp0k8jWdAvMA27W3EwgHHNeVGWbJPC0Dn7RqPw13r7hFyS5TpleywjdY1nB7ad6kcZXZbEcaFZ7ZuerA6RkPGE+PsnZRb1oFJkYoXimsuvkVFhWeHQXCGC1cuDWSrM3cpQvOzKH2vS7d15+zGls4IwIDAQABo4IDaTCCA2UwHwYDVR0jBBgwFoAUt2ui6qiqhIx56rTaD5iyxZV2ufQwHQYDVR0OBBYEFCYa+OSxsHKEztqBBtInmPvtOj0XMIGBBgNVHREEejB4gg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUuY29tggtleGFtcGxlLmVkdYILZXhhbXBsZS5uZXSCC2V4YW1wbGUub3Jngg93d3cuZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLmVkdYIPd3d3LmV4YW1wbGUubmV0MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwgYsGA1UdHwSBgzCBgDA+oDygOoY4aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VExTUlNBU0hBMjU2MjAyMENBMS5jcmwwPqA8oDqGOGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNv\"\u003e\n#\u003cstruct Masscan::Banner protocol=:tcp, port=80, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-26 16:07:35 -0700, app_protocol=:http_server, payload=\"ECS (sec/97A6)\"\u003e\n#\u003cstruct Masscan::Banner protocol=:tcp, port=80, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-26 16:07:35 -0700, app_protocol=:html_title, payload=\"404 - Not Found\"\u003e\n#\u003cstruct Masscan::Banner protocol=:tcp, port=80, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-26 16:07:35 -0700, app_protocol=:http, payload=\"HTTP/1.0 404 Not Found\\r\\nContent-Type: text/html\\r\\nDate: Thu, 26 Aug 2021 23:07:35 GMT\\r\\nServer: ECS (sec/97A6)\\r\\nContent-Length: 345\\r\\nConnection: close\\r\\n\\r\"\u003e\n```\n\nParse `masscan` simple list output files:\n\n```ruby\noutput_file = Masscan::OutputFile.new('masscan.txt', format: :list)\noutput_file.each do |record|\n  p record\nend\n```\n\n```\n#\u003cstruct Masscan::Status status=:open, protocol=:tcp, port=443, reason=nil, ttl=nil, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:47:50 -0700, mac=nil\u003e\n#\u003cstruct Masscan::Status status=:open, protocol=:tcp, port=80, reason=nil, ttl=nil, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:47:50 -0700, mac=nil\u003e\n#\u003cstruct Masscan::Status status=:open, protocol=:icmp, port=0, reason=nil, ttl=nil, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:47:50 -0700, mac=nil\u003e\n#\u003cstruct Masscan::Banner protocol=:tcp, port=443, ttl=nil, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:47:52 -0700, app_protocol=:ssl3, payload=\"TLS/1.1 cipher:0xc013, www.example.org, www.example.org, example.com, example.edu, example.net, example.org, www.example.com, www.example.edu, www.example.net\"\u003e\n#\u003cstruct Masscan::Banner protocol=:tcp, port=443, ttl=nil, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:47:52 -0700, app_protocol=:x509, payload=\"MIIG1TCCBb2gAwIBAgIQD74IsIVNBXOKsMzhya/uyTANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSkwJwYDVQQDEyBEaWdpQ2VydCBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTAeFw0yMDExMjQwMDAwMDBaFw0yMTEyMjUyMzU5NTlaMIGQMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEUMBIGA1UEBxMLTG9zIEFuZ2VsZXMxPDA6BgNVBAoTM0ludGVybmV0IENvcnBvcmF0aW9uIGZvciBBc3NpZ25lZCBOYW1lcyBhbmQgTnVtYmVyczEYMBYGA1UEAxMPd3d3LmV4YW1wbGUub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuvzuzMoKCP8Okx2zvgucA5YinrFPEK5RQP1TX7PEYUAoBO6i5hIAsIKFmFxtW2sghERilU5rdnxQcF3fEx3sY4OtY6VSBPLPhLrbKozHLrQ8ZN/rYTb+hgNUeT7NA1mP78IEkxAj4qG5tli4Jq41aCbUlCt7equGXokImhC+UY5IpQEZS0tKD4vu2ksZ04Qetp0k8jWdAvMA27W3EwgHHNeVGWbJPC0Dn7RqPw13r7hFyS5TpleywjdY1nB7ad6kcZXZbEcaFZ7ZuerA6RkPGE+PsnZRb1oFJkYoXimsuvkVFhWeHQXCGC1cuDWSrM3cpQvOzKH2vS7d15+zGls4IwIDAQABo4IDaTCCA2UwHwYDVR0jBBgwFoAUt2ui6qiqhIx56rTaD5iyxZV2ufQwHQYDVR0OBBYEFCYa+OSxsHKEztqBBtInmPvtOj0XMIGBBgNVHREEejB4gg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUuY29tggtleGFtcGxlLmVkdYILZXhhbXBsZS5uZXSCC2V4YW1wbGUub3Jngg93d3cuZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLmVkdYIPd3d3LmV4YW1wbGUubmV0MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwgYsGA1UdHwSBgzCBgDA+oDygOoY4aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VExTUlNBU0hBMjU2MjAyMENBMS5jcmwwPqA8oDqGOGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNv\"\u003e\n#\u003cstruct Masscan::Banner protocol=:tcp, port=80, ttl=nil, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:47:52 -0700, app_protocol=:http_server, payload=\"ECS (sec/974D)\"\u003e\n#\u003cstruct Masscan::Banner protocol=:tcp, port=80, ttl=nil, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:47:52 -0700, app_protocol=:html_title, payload=\"404 - Not Found\"\u003e\n#\u003cstruct Masscan::Banner protocol=:tcp, port=80, ttl=nil, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:47:52 -0700, app_protocol=:http, payload=\"HTTP/1.0 404 Not Found\\r\\nContent-Type: text/html\\r\\nDate: Thu, 26 Aug 2021 06:47:52 GMT\\r\\nServer: ECS (sec/974D)\\r\\nContent-Length: 345\\r\\nConnection: close\\r\\n\\r\"\u003e\n```\n\nParse `masscan` JSON output files:\n\n```ruby\noutput_file = Masscan::OutputFile.new('masscan.json', format: :json)\noutput_file.each do |record|\n  p record\nend\n```\n\n```\n#\u003cstruct Masscan::Status status=:open, protocol=:tcp, port=80, reason=[:syn, :ack], ttl=54, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:50:21 -0700, mac=nil\u003e\n#\u003cstruct Masscan::Status status=:open, protocol=:tcp, port=443, reason=[:syn, :ack], ttl=54, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:50:21 -0700, mac=nil\u003e\n#\u003cstruct Masscan::Status status=:open, protocol=:icmp, port=0, reason=[\"none\"], ttl=54, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:50:22 -0700, mac=nil\u003e\n#\u003cstruct Masscan::Banner protocol=:tcp, port=80, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:50:24 -0700, app_protocol=:http_server, payload=\"ECS (sec/974D)\"\u003e\n#\u003cstruct Masscan::Banner protocol=:tcp, port=80, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:50:24 -0700, app_protocol=:html_title, payload=\"404 - Not Found\"\u003e\n#\u003cstruct Masscan::Banner protocol=:tcp, port=80, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:50:24 -0700, app_protocol=:http, payload=\"HTTP/1.0 404 Not Found\\r\\nContent-Type: text/html\\r\\nDate: Thu, 26 Aug 2021 06:50:24 GMT\\r\\nServer: ECS (sec/974D)\\r\\nContent-Length: 345\\r\\nConnection: close\\r\\n\\r\"\u003e\n#\u003cstruct Masscan::Banner protocol=:tcp, port=443, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:50:33 -0700, app_protocol=:ssl3, payload=\"TLS/1.1 cipher:0xc013, www.example.org, www.example.org, example.com, example.edu, example.net, example.org, www.example.com, www.example.edu, www.example.net\"\u003e\n#\u003cstruct Masscan::Banner protocol=:tcp, port=443, ip=#\u003cIPAddr: IPv4:93.184.216.34/255.255.255.255\u003e, timestamp=2021-08-25 23:50:33 -0700, app_protocol=:x509, payload=\"MIIG1TCCBb2gAwIBAgIQD74IsIVNBXOKsMzhya/uyTANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSkwJwYDVQQDEyBEaWdpQ2VydCBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTAeFw0yMDExMjQwMDAwMDBaFw0yMTEyMjUyMzU5NTlaMIGQMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEUMBIGA1UEBxMLTG9zIEFuZ2VsZXMxPDA6BgNVBAoTM0ludGVybmV0IENvcnBvcmF0aW9uIGZvciBBc3NpZ25lZCBOYW1lcyBhbmQgTnVtYmVyczEYMBYGA1UEAxMPd3d3LmV4YW1wbGUub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuvzuzMoKCP8Okx2zvgucA5YinrFPEK5RQP1TX7PEYUAoBO6i5hIAsIKFmFxtW2sghERilU5rdnxQcF3fEx3sY4OtY6VSBPLPhLrbKozHLrQ8ZN/rYTb+hgNUeT7NA1mP78IEkxAj4qG5tli4Jq41aCbUlCt7equGXokImhC+UY5IpQEZS0tKD4vu2ksZ04Qetp0k8jWdAvMA27W3EwgHHNeVGWbJPC0Dn7RqPw13r7hFyS5TpleywjdY1nB7ad6kcZXZbEcaFZ7ZuerA6RkPGE+PsnZRb1oFJkYoXimsuvkVFhWeHQXCGC1cuDWSrM3cpQvOzKH2vS7d15+zGls4IwIDAQABo4IDaTCCA2UwHwYDVR0jBBgwFoAUt2ui6qiqhIx56rTaD5iyxZV2ufQwHQYDVR0OBBYEFCYa+OSxsHKEztqBBtInmPvtOj0XMIGBBgNVHREEejB4gg93d3cuZXhhbXBsZS5vcmeCC2V4YW1wbGUuY29tggtleGFtcGxlLmVkdYILZXhhbXBsZS5uZXSCC2V4YW1wbGUub3Jngg93d3cuZXhhbXBsZS5jb22CD3d3dy5leGFtcGxlLmVkdYIPd3d3LmV4YW1wbGUubmV0MA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwgYsGA1UdHwSBgzCBgDA+oDygOoY4aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VExTUlNBU0hBMjU2MjAyMENBMS5jcmwwPqA8oDqGOGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNv\"\u003e\n```\n\n## Requirements\n\n* [ruby] \u003e= 2.0.0\n* [masscan] \u003e= 1.0.0\n* [command_mapper] ~\u003e 0.1\n\n## Install\n\n```shell\n$ gem install ruby-masscan\n```\n\n### gemspec\n\n```ruby\ngemspec.add_dependency 'ruby-masscan', '~\u003e 0.2'\n```\n\n### Gemfile\n\n```ruby\ngem 'ruby-masscan', '~\u003e 0.2'\n```\n\n## License\n\nCopyright (c) 2021-2023 Hal Brodigan\n\nSee {file:LICENSE.txt} for license information.\n\n[masscan]: https://github.com/robertdavidgraham/masscan#readme\n[ruby]: https://www.ruby-lang.org/\n[command_mapper]: https://github.com/postmodern/command_mapper.rb#readme\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpostmodern%2Fruby-masscan","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpostmodern%2Fruby-masscan","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpostmodern%2Fruby-masscan/lists"}