Como colocar os comandos do iptables ao redor do servidor Ruby webrick indo para cima e para baixo em um único comando / script?

1

Eu gostaria de usar essa solução do servidor do Ruby WEBrick para a demanda mostrando algumas páginas da Web aleatórias. Então, configurei uma exceção de encaminhamento na interface da Web local do modem adsl (192.168.2.1). Então habilitado iptables com um muito básico configuração . Eu uso um comando iptables para abrir temporariamente a porta 3000 para tcp, depois inicio o script Ruby , e quando eu interrompo o servidor (com ctlr-c), ele fecha e eu removo esse mesmo filtro regra para arrumar as coisas (mesmo que eu saiba que a regra não persistiria durante as reinicializações):

# sudo iptables -I INPUT -p tcp --dport 3000 -j ACCEPT
# ./myscript(ruby) - server goes up
<ctrl-c>          - server goes down
# sudo iptables -D INPUT -p tcp --dport 3000 -j ACCEPT

Como eu faria isso com um único comando / script? Eu posso fazer um alias para quebrar o primeiro comando e iniciar o servidor, mas não está claro como cuidar da saída e do último comando ...

    
por jus cogens prime 07.11.2014 / 12:52

1 resposta

1

Eu não sei como fazer isso com o shell. Mas como o script já está capturando o sinal de interrupção, você também pode aproveitar isso e adicionar um comando extra, já que pode executar comandos com esse interpretador, da seguinte forma:

#!/usr/bin/env ruby

require 'webrick'
system *%W(sudo iptables -I INPUT -p tcp --dport 3000 -j ACCEPT)
server = WEBrick::HTTPServer.new(:Port => 3000,
                                 :DocumentRoot => '~/webrickroot')

# stop server with Ctrl-C
trap('INT') { server.stop; system *%W(sudo iptables -D INPUT -p tcp --dport 3000 -j ACCEPT) }
server.start

Usando, por conveniência, um conjunto de palavras separadas em branco com system ecoa algumas preocupações para a sanidade de como as construções dos comandos poderiam ser interpretadas e processadas em geral . Cada token é aparentemente fornecido para sudo como um argumento aqui 1 . Obviamente, você será solicitado a fornecer sua senha (duas vezes), pois iptables requer privilégios de superusuário para qualquer uso significativo, incluindo a adição e remoção interativa de regras.

1. Como demonstrou com o apt% código%. É claro que NÃO tente isto sem o componente splat + word array (*% W) enquanto cita o que está dentro dos parênteses.

    
por 07.11.2014 / 12:52