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.