大家好,又见面了,我是全栈君。
第一步:在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://my.oschina.net/u/2935389/blog/1620318
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/107711.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...