2016-01-23 2 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

ответ

1

Работал для меня:

 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"); 
     } 

     fs.readFile(FirewallConstants.IPTABLES_RULES, 'utf8', function (err,data) { 
      if (err) { 
       cb(err); 
       return; 
      } 

      var result = data.replace("${DROP_INTERFACE}", dropInterface.join('\n')); 
      fs.writeFile(FirewallConstants.IPTABLES_RULES, result, 'utf8', function (err) { 
       cb(err); 
      }); 
     });