2013-06-25 4 views
0

Я хочу раскомментировать строку 168 в файле etter.conf. Команда работает нормально в терминале, но я получаю сообщение об ошибке при попытке его использования в perl.Использование sed для замены строки в perl

system ("sed -i '168s/.*/redir_command_on = "iptables -t nat -A PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport"/' /etc/etter.conf"); 

Ошибка:

Bareword found where operator expected at ./attack.pl line 135, near 
""sed -i '168s'/.*'/redir_command_on = "iptables" 

Я думаю, что это что-то делать со специальными символами и побегах.

+0

Вам нужно избегать ваших вложенных кавычек. Perl считает, что iptables предполагается переменным. –

+0

Двойные запросы в команде завершают строку perl. – Barmar

+3

Есть ли причина, по которой вы обманываете 'sed'? Perl отлично способен обновлять файл самостоятельно. – Barmar

ответ

5

Так Perl является разбор вперед, и он находит строковый литерал

system ("sed -i '168s/.*/redir_command_on = " 
     ^        ^
     |         | 
     +-----------------------------------+ 

Что дальше должно быть ) или оператор, но это iptables. Вы неправильно сформировали строковый литерал. Импульсные ограничители будут делать трюк:

system(q{sed -i '168s/.*/redir_command_on = "..."/' /etc/etter.conf}) 

(q{...} такими же, как '...'.)

Кстати, с помощью «формы списка» для system лучше, так как это позволяет избежать запуска и использование оболочки без необходимости ,

system('sed', '-i', '168s/.*/redir_command_on = "..."/', '/etc/etter.conf') 
+0

+1 для рекомендации использования системы() со списком аргументов –

+0

nice, вы также можете заменить 'system (q {...' на 'system (qw {...', чтобы автоматически получить форму списка. – steabert

+0

@ steabert, No. Вы получите список, но это не будет правильная команда. – ikegami

1

Вы не можете вставлять короткие двойные кавычки в строку с двойными кавычками. Perl имеет более quoting operators вы можете использовать.

# Instead of 
system ("sed -i '168s/.*/redir_command_on = "iptables -t nat -A PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport"/' /etc/etter.conf"); 

# use 
system (q{sed -i '168s/.*/redir_command_on = "iptables -t nat -A PREROUTING -i %iface -p tcp --dport %port -j REDIRECT --to-port %rport"/' /etc/etter.conf}); 
#-------^^------------------------------------------------------------------------------------------------------------------------------------------------^ 
Смежные вопросы