Я делаю сценарий, который добавляет образец файла /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();
});
Ни один из моих методов не работал, у меня были различные ошибки, такие как:
- Не заменяет строку на всех
- Испытано с
!DROP_INTERFACE
вместо${DROP_INTERFACE}
, только «!» персонаж был удален. ${DROP_INTERFACE}
является неправильным вхождением (или что-то подобное).
У кого-нибудь есть рабочий пример вставки нескольких строк с использованием sed из сценария nodejs?
Основная цель - отбросить доступ с этого интерфейса к любым службам, прослушивающим общедоступные интерфейсы (0.0.0.0
).
Почему вы не используете 'nodejs' для этого? – hek2mgl
Что это значит? это узел js. можете ли вы привести пример? – BigDong
http://stackoverflow.com/questions/14177087/replace-a-string-in-a-file-with-nodejs – hek2mgl