基於網頁的認證跳轉實現

第一步:在Web服務器上加一條跳轉命令,將全部客戶端瀏覽器80端口的全部請求都跳轉到web服務器首頁,命令以下:node

           iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.6.1:80  (root權限執行)web

          這條命令將客戶端80端口的請求都跳轉到web服務器地址(192.168.6.1:80  具體根據本身web服務器的ip和端口)shell

         另外,將指定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放行dom

          客戶端打開瀏覽器應該會被重定向到咱們的web首頁,這個時候點擊網頁首頁上的一個按鈕,將客戶端ip傳到服務器端,服務器接收到ip後執行放行命令,以下:tcp

       var exec = require('child_process').exec;   ui

       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');
         });spa

       固然,我這兒是用的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

相關文章
相關標籤/搜索