大家好,又见面了,我是全栈君。
第一步:在Web服务器上加一条跳转命令,将所有客户端浏览器80端口的所有请求都跳转到web服务器首页,命令如下:
iptables -t nat -A PREROUTING -p tcp –dport 80 -j DNAT –to 192.168.6.1:80 (root权限执行)
这条命令将客户端80端口的请求都跳转到web服务器地址(192.168.6.1:80 具体根据自己web服务器的ip和端口)
另外,将指定ip跳转到指定地址的命令如下:
iptables -t nat -A PREROUTING -s 192.168.6.102 -p tcp –dport 80 -j DNAT –to 192.168.6.1:80 (root权限执行)
上面这条命令就相当于将ip为192.168.6.102的客户端跳转到服务器地址首页
第二步:通过网页接口将客户端ip放行
客户端打开浏览器应该会被重定向到我们的web首页,这个时候点击网页首页上的一个按钮,将客户端ip传到服务器端,服务器接收到ip后执行放行命令,如下:
var exec = require(‘child_process’).exec;
router.get(‘/random’, function(req, res, next){ var ip = req.ip.substring(7, req.ip.length); exec(‘iptables -t nat -I PREROUTING 1 -s ‘ ip ’ -j ACCEPT’); exec(‘iptables -t nat -I PREROUTING 1 -s ‘ ip ’ -j RETURN’); log(‘jump’, req.ip, ‘surfing the internet’); res.success(“ready to the internet!”); res.redirect(‘back’); });
当然,我这儿是用的nodejs框架,重要看两个部分:
1. iptables -t nat -I PREROUTING 1 -s ‘ ip ’ -j ACCEPT 这条命令会将客户端地址为ip的放行,相当于通过了认证,执行完这条命令后这个ip的客户端就可以正常上网了
当然,删除命令:iptables -t nat -D PREROUTING ‘ ip ’ -j ACCEPT
2. nodejs执行脚本的接口exec, 这里通过var exec = require(‘child_process’).exec; 创建了一个子进程,然后就可以很方便地调用shell脚本了,十分方便。
这里顺便介绍一下nodejs子进程:
NodeJS 子进程提供了与系统交互的重要接口,其主要 API 有:
标准输入、标准输出及标准错误输出的接口 child.stdin 获取标准输入 child.stdout 获取标准输出 child.stderr 获取标准错误输出 获取子进程的PID:child.pid 提供生成子进程的重要方法:child_process.spawn(cmd, args=[], [options]) 提供直接执行系统命令的重要方法:child_process.exec(cmd, [options], callback) 提供杀死进程的方法:child.kill(signal=’SIGTERM’)
实例一:利用子进程获取系统内存使用情况
创建文件test1.js 写入如下代码:
var spawn = require(‘child_process’).spawn, free = spawn(‘free’, [‘-m’]);
// 捕获标准输出并将其打印到控制台 free.stdout.on(‘data’, function (data) { console.log(‘标准输出:n’ data); });
// 捕获标准错误输出并将其打印到控制台 free.stderr.on(‘data’, function (data) { console.log(‘标准错误输出:n’ data); });
// 注册子进程关闭事件 free.on(‘exit’, function (code, signal) { console.log(‘子进程已退出,代码:’ code); });
保存后执行文件
$ node test1.js 标准输出: total used free shared buffers cached Mem: 3949 1974 1974 0 135 959 -/ buffers/cache: 879 3070 Swap: 3905 0 3905
子进程已退出,代码:0 以上输出相当与在命令行执行:free -m 命令。
实例一:利用子进程统计登陆次数
创建文件test2.js 写入如下代码:
var exec = require(‘child_process’).exec, last = exec(‘last | wc -l’);
last.stdout.on(‘data’, function (data) { console.log(‘标准输出:’ data); });
last.on(‘exit’, function (code) { console.log(‘子进程已关闭,代码:’ code); });
保存后执行文件
$ node test2.js 标准输出:203
子进程已关闭,代码:0 其与直接在命令行输入:last | wc -l 的结果是一样的。
具体可以参看文章:http://www.jb51.net/article/37951.htm
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/107711.html原文链接:https://javaforall.cn