단일 명령/스크립트로 Ruby webrick 서버에서 iptables 명령을 위아래로 실행하는 방법은 무엇입니까?

단일 명령/스크립트로 Ruby webrick 서버에서 iptables 명령을 위아래로 실행하는 방법은 무엇입니까?

이 루비를 사용하고 싶어요베릭섬기는 사람해결책요청 시 임의의 웹 페이지를 표시하는 데 사용됩니다. 그래서 Adsl 모뎀의 로컬 웹 인터페이스(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) 없이 이 작업을 시도하지 마세요.

관련 정보