単一のコマンド/スクリプトでRuby webrickサーバーでiptablesコマンドを上下に実行するには?

単一のコマンド/スクリプトでRuby webrickサーバーでiptablesコマンドを上下に実行するには?

このルビーを使いたいベリック仕える人解決策要求に応じて任意のWebページを表示するために使用されます。そのため、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、インタラクティブルールの追加と削除など、重要な使用にはスーパーユーザー権限が必要なため、パスワード(2)を求めるメッセージが表示されます。


1.〜のように証明済み適切にruby -e 'system *%W(ls -l foo; rm -rf /)'。もちろん、括弧内の内容を引用するときは、表示+単語配列コンポーネント(*%W)なしでこれを試みないでください。

おすすめ記事