├── index.js ├── .gitignore ├── lib ├── utils.js └── scan.js ├── tests ├── ports.js ├── ips.js ├── listener.js └── range.js ├── package.json ├── LICENSE ├── bin └── scan └── README.md /index.js: -------------------------------------------------------------------------------- 1 | module.exports = require('./lib/scan'); -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # dir 2 | node_modules/ 3 | 4 | # files 5 | *.log -------------------------------------------------------------------------------- /lib/utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Check and invoke callback function 3 | */ 4 | exports.invokeCallback = function(cb) { 5 | if ( !! cb && typeof cb === 'function') { 6 | cb.apply(null, Array.prototype.slice.call(arguments, 1)); 7 | } 8 | }; -------------------------------------------------------------------------------- /tests/ports.js: -------------------------------------------------------------------------------- 1 | var scan = require('..'); 2 | 3 | console.time('ports scan'); 4 | scan.port({ 5 | host: 'github.com', 6 | ports: [20, 21, 22, 80, 443, 3306, 27017], 7 | timeout: 2000 8 | }, function(err, result) {     9 | console.timeEnd('ports scan'); 10 | console.log('open ports:', result); 11 | }); 12 | -------------------------------------------------------------------------------- /tests/ips.js: -------------------------------------------------------------------------------- 1 | var scan = require('..'); 2 | 3 | console.time('ips scan'); 4 | scan.ip({ 5 | ips: [ 6 | 'lellansin.com', 7 | 'www.baidu.com', 8 | 'lellansinasdf1234zxcv234.com', 9 | '111.111.111.111', 10 | ], 11 | timeout: 30000 12 | }, function(err, result) {     13 | console.timeEnd('ips scan'); 14 | console.log('open ips:', result); 15 | }); -------------------------------------------------------------------------------- /tests/listener.js: -------------------------------------------------------------------------------- 1 | var scan = require('..'); 2 | 3 | console.time('ports scan'); 4 | scan.port({ 5 | host: 'github.com', 6 | start: 1, 7 | end: 1000, 8 | timeout: 2000, 9 | queue: 1000 10 | }) 11 | .on('open', function(port) { 12 | console.log('found port open', port); 13 | }) 14 | .on('end', function(port) { 15 | console.timeEnd('ports scan'); 16 | console.log('scan port over'); 17 | }); 18 | -------------------------------------------------------------------------------- /tests/range.js: -------------------------------------------------------------------------------- 1 | var scan = require('..'); 2 | 3 | console.time('ports scan'); 4 | scan.port({ 5 | <<<<<<< HEAD 6 | host: '115.236.140.12', 7 | start: 1, 8 | end: 65535, 9 | timeout: 2000, 10 | queue: 1000 11 | ======= 12 | host: 'github.com', 13 | start: 1, 14 | end: 1000, 15 | timeout: 2000, 16 | queue: 1000 17 | >>>>>>> origin/master 18 | }, function(err, result) {     19 | console.timeEnd('ports scan'); 20 | console.log('open ports:', result); 21 | }); 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "net-scan", 3 | "version": "0.1.0", 4 | "description": "scan ports & ips", 5 | "main": "index", 6 | "dependencies": { 7 | "async": "^1.2.1", 8 | "commander": "^2.2.0", 9 | "progress": "~1.1.5" 10 | }, 11 | "devDependencies": {}, 12 | "scripts": { 13 | "test": "node ./bin/scan -h github.com -r 1~1000" 14 | }, 15 | "bin": { 16 | "scan": "./bin/scan" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "https://github.com/Lellansin/node-net-scan.git" 21 | }, 22 | "keywords": [ 23 | "scan", 24 | "port" 25 | ], 26 | "author": { 27 | "name": "lellansin", 28 | "email": "lellansin@gmail.com" 29 | }, 30 | "license": "MIT", 31 | "bugs": { 32 | "url": "https://github.com/Lellansin/node-net-scan/issues" 33 | }, 34 | "readmeFilename": "README.md" 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Lellansin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /bin/scan: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var util = require('util'); 8 | var program = require('commander'); 9 | var version = require('../package').version; 10 | var scan = require('../lib/scan'); 11 | 12 | function range(val) { 13 | return val.split('~').map(Number); 14 | } 15 | 16 | program 17 | .version(version) 18 | .option('-p, --port', 'Scan ports') 19 | .option('-h, --host [host]', 'Scan ips') 20 | .option('-i, --ip', 'Scan ips') 21 | .option('-r, --range ~', 'Set area scan type', range) 22 | .parse(process.argv); 23 | 24 | if (program.host) { 25 | if (!program.range) { 26 | console.log('please use -r to specialfy the ports range'); 27 | return; 28 | } 29 | if (program.range.length != 2) { 30 | console.log('range not right'); 31 | return; 32 | } 33 | console.time('ports scan'); 34 | scan.port({ 35 | host: program.host, 36 | start: program.range[0], 37 | end: program.range[1], 38 | cli: true 39 | }, function(err, result) {     40 | console.timeEnd('ports scan'); 41 | console.log('open ports:', result); 42 | }); 43 | return; 44 | } 45 | 46 | console.log('Usage Example:'); 47 | console.log('node scan -h 192.168.108.46 -r 0~65535'); -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Net scan 3 | 4 | * scan port 5 | * scan ip 6 | 7 | ## Installation 8 | 9 | ```shell 10 | npm install net-scan -g 11 | ``` 12 | 13 | ## CLI 14 | 15 | ```shell 16 | npm test 17 | ``` 18 | 19 | ```shell 20 | scan -h github.com -r 1~1000 21 | ``` 22 | 23 | Output: 24 | 25 | ```shell 26 | scan host: github.com ports 1~1000 27 | port 80 is open 28 | scanning [ ] 0% 1/1000 port 22 is open 29 | scanning [ ] 0% 2/1000 port 443 is open 30 | scanning [====================] 100% 1000/1000 31 | ports scan: 5245ms 32 | open ports: [ 80, 22, 443 ] 33 | ``` 34 | 35 | ## Example 36 | 37 | ### Range scan 38 | ```javascript 39 | var scan = require('net-scan'); 40 | 41 | console.time('ports scan'); 42 | scan.port({ 43 | host: 'github.com', 44 | start: 1, 45 | end: 1000, 46 | timeout: 2000, 47 | queue: 1000 48 | }, function(err, result) {     49 | console.timeEnd('ports scan'); 50 | console.log('open ports:', result); 51 | }); 52 | ``` 53 | 54 | Output 55 | 56 | ```shell 57 | ports scan: 2232ms 58 | open ports: [ 22, 80, 443 ] 59 | ``` 60 | 61 | ### Ports scan 62 | ```javascript 63 | var scan = require('net-scan'); 64 | 65 | console.time('ports scan'); 66 | scan.port({ 67 | host: 'github.com', 68 | ports: [20, 21, 22, 80, 443, 3306, 27017], 69 | timeout: 2000 70 | }, function(err, result) {     71 | console.timeEnd('ports scan'); 72 | console.log('open ports:', result); 73 | }); 74 | 75 | ``` 76 | 77 | Output 78 | 79 | ```shell 80 | ports scan: 2015ms 81 | open ports: [ 443, 22, 80 ] 82 | ``` 83 | 84 | ### Listener 85 | ```javascript 86 | console.time('ports scan'); 87 | scan.port({ 88 | host: 'github.com', 89 | start: 1, 90 | end: 1000, 91 | timeout: 2000, 92 | queue: 1000 93 | }) 94 | .on('open', function(port) { 95 | console.log('found port open', port); 96 | }) 97 | .on('end', function(port) { 98 | console.timeEnd('ports scan'); 99 | console.log('scan port over'); 100 | }); 101 | 102 | ``` 103 | 104 | Output 105 | 106 | ```shell 107 | found port open 22 108 | found port open 80 109 | found port open 443 110 | ports scan: 2243ms 111 | scan port over 112 | ``` 113 | 114 | ## Todo 115 | * scan array ips 116 | * add command.js op 117 | -------------------------------------------------------------------------------- /lib/scan.js: -------------------------------------------------------------------------------- 1 | var net = require('net'); 2 | var util = require('util'); 3 | var utils = require('./utils'); 4 | var EventEmitter = require('events').EventEmitter; 5 | var async = require('async'); 6 | var ProgressBar = require('progress'); 7 | 8 | function Scan() {} 9 | 10 | util.inherits(Scan, EventEmitter); 11 | module.exports = new Scan(); 12 | 13 | Scan.prototype.port = function(options, callback) { 14 | var self = this; 15 | var host = options.host, 16 | start = options.start, 17 | end = options.end, 18 | queue_max = options.queue || 1000, 19 | timeout = options.timeout || 5 * 1000, 20 | debug = options.debug || options.cli || false, 21 | ports = getPorts(options), 22 | count = 0, 23 | bar; 24 | 25 | if (!checkHost(host)) { 26 | var err = new Error('Host is invalid'); 27 | self.emit('error', err); 28 | return utils.invokeCallback(callback, err); 29 | } 30 | 31 | var total = end - start + 1; 32 | if (debug) { 33 | console.log('scan host: %s ports %d~%d', host, start, end, options.ports || ''); 34 | 35 | bar = new ProgressBar('scanning [:bar] :percent :count/' + total + ' \t', { 36 | complete: '=', 37 | incomplete: ' ', 38 | width: 20, 39 | total: total 40 | }); 41 | } 42 | 43 | var result = []; 44 | async.eachLimit(ports, queue_max, 45 | function(port, next) { 46 | var conn = net.connect({ 47 | host: host, 48 | port: port 49 | }, function() { 50 | if (debug) { 51 | console.log('port ' + port + ' is open'); 52 | } 53 | 54 | self.emit('open', port); 55 | result.push(port); 56 | this.destroy(); 57 | }); 58 | 59 | conn.on('error', function(err) { 60 | if (debug) { 61 | console.error('error', err, port); 62 | } 63 | this.destroy(); 64 | }); 65 | 66 | conn.on('close', function() { 67 | if (debug) { 68 | bar.tick({ 69 | count: ++count 70 | }); 71 | } 72 | next(); 73 | }); 74 | 75 | conn.setTimeout(timeout, function() { 76 | this.destroy(); 77 | }); 78 | }, 79 | function(err) { 80 | self.emit('end'); 81 | utils.invokeCallback(callback, err, result); 82 | }); 83 | 84 | return self; 85 | }; 86 | 87 | Scan.prototype.ip = function(options, callback) { 88 | var self = this; 89 | var queue_max = options.queue || 255, 90 | timeout = options.timeout || 5 * 1000, 91 | ips = options.ips, 92 | count = 0; 93 | 94 | var result = []; 95 | async.eachLimit(ips, queue_max, 96 | function(ip, next) { 97 | var conn = net.connect({ 98 | host: ip, 99 | port: 1 100 | }, function() { 101 | result.push(ip); 102 | this.destroy(); 103 | }); 104 | 105 | conn.on('error', function(err) { 106 | console.log('err.code', err.code); 107 | if (err.code == 'ECONNREFUSED') { 108 | result.push(ip); 109 | } else { 110 | console.log('err', err.code, ip); 111 | } 112 | this.destroy(); 113 | }); 114 | 115 | conn.on('close', function() { 116 | next(); 117 | }); 118 | 119 | conn.setTimeout(timeout, function() { 120 | this.destroy(); 121 | }); 122 | }, 123 | function(err) { 124 | utils.invokeCallback(callback, err, result); 125 | }); 126 | 127 | return self; 128 | }; 129 | 130 | // todo 131 | var checkHost = function() { 132 | return true; 133 | }; 134 | 135 | var getPorts = function(options) { 136 | var ports = options.ports || []; 137 | for (var i = options.start; i <= options.end; i++) { 138 | ports.push(i); 139 | } 140 | return ports; 141 | }; 142 | --------------------------------------------------------------------------------