2016-01-23 32 views
0

我正在做一個腳本,在我的服務器上添加一個/etc/iptables.rules文件樣本。從一個NodeJS腳本,使用sed,如何用多行字符串替換字符串

/etc/iptables.rules

*filter 

-P INPUT ACCEPT 
-P FORWARD ACCEPT 
-P OUTPUT ACCEPT 
-N DOCKER 
${DROP_INTERFACE} 
-A FORWARD -o docker0 -j DOCKER 
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT 
-A FORWARD -i docker0 -o docker0 -j ACCEPT 

COMMIT 

然後,節點JS腳本後${DROP_INTERFACE}多行添加然後取下標籤:

app.js

// retrieve public interface in order to restrict access 
var names = _.pluck(results.publicIfaceList, 'name'); 
var dropInterface = []; // eg : ['eth1', 'eth2"] 
for(var i = 0; i < names.length; i++){ 
    // add a new DROP rule 
    dropInterface.push("-A FORWARD -i "+names[i]+" -j DROP"); 
} 

// for each rules 
async.eachSeries(dropInterface, function iterator(item, next){ 
    // add a line after ${DROP_INTERFACE} 
    var cmd = "sed -i '/${DROP_INTERFACE}/a " + item + "' " + FirewallConstants.IPTABLES_RULES; 
    bash.execute(cmd, function(output){ 
     next(); 
    }); 
}, function done(){ 
    // remove the line with ${DROP_INTERFACE} 
    var cmd = "sed -i '/${DROP_INTERFACE}/d' " + FirewallConstants.IPTABLES_RULES; 
    bash.execute(cmd, function(output){ 
     cb(); 
    }); 
}); 

我也嘗試用多行替換標籤:

var names = _.pluck(results.publicIfaceList, 'name'); 
var dropInterface = []; 
for(var i = 0; i < names.length; i++){ 
    dropInterface.push("-A FORWARD -i "+names[i]+" -j DROP"); 
} 
var cmd = "sed -i '/${DROP_INTERFACE}/c\\"+dropInterface.join('\n')+"' /etc/iptables.rules"; 
bash.execute(cmd, function (output){ 
    cb(); 
}); 

無我的方法的工作,我有過不同的錯誤:

  1. 在所有
  2. !DROP_INTERFACE代替${DROP_INTERFACE}測試不替換字符串,只有「!」角色被刪除。
  3. ${DROP_INTERFACE}是錯誤的發生(或類似的東西)

有沒有人有一個使用sed從nodejs腳本多行文本插入的工作示例?

主要目標是將訪問從此接口丟棄到在公共接口上偵聽的任何服務(0.0.0.0)。

+0

你爲什麼不使用該'nodejs'? – hek2mgl

+0

你是什麼意思?它是節點js。你能舉一個例子嗎? – BigDong

+1

http://stackoverflow.com/questions/14177087/replace-a-string-in-a-file-with-nodejs – hek2mgl

回答