如何在单个命令/脚本中围绕 Ruby webrick 服务器上下运行 iptables 命令?

如何在单个命令/脚本中围绕 Ruby webrick 服务器上下运行 iptables 命令?

我想使用这个红宝石韦瑞克服务器解决方案用于按需展示一些随机网页。因此,我在我的 adsl 调制解调器本地 Web 界面(192.168.2.1)上设置了一些转发例外。然后启用iptables具有非常基本的设置。我使用iptables命令暂时打开 tcp 端口 3000,然后启动红宝石脚本,当我中断服务器(使用ctlr-c)时,它会关闭,然后我删除相同的过滤规则来整理事情(即使我知道该规则不会在重新启动时持续存在):

# 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

我如何使用单个命令/脚本来做到这一点?我可以做一个别名包装第一个命令并启动服务器,但不清楚如何处理退出和最后一个命令......

答案1

我不知道如何用外壳做到这一点。但由于脚本已经捕获了中断信号,您也可以利用它并在那里添加一个额外的命令,因为您可以使用该解释器执行命令,如下所示:

#!/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

为方便起见使用空白分隔词数组system回应一些担忧为了一般地解释和处理命令的结构的合理性。每个标记似乎都sudo作为参数提供给这里1。当然,您会被要求输入密码(两次),因为iptables任何重要用途都需要超级用户权限,包括交互式添加和删除规则。


1. 作为证明了与 apt ruby -e 'system *%W(ls -l foo; rm -rf /)'。当然,在引用括号内的内容时,请勿在没有 splat+word 数组组件(*%W)的情况下尝试此操作。

相关内容