2014-08-29 7 views
0

Справочная информация. Таким образом, нам предоставили этот сценарий в классе с целью открытия случайных непривилегированных портов на наших виртуальных машинах Ubuntu. Он дал нам два примера TCP и попросил нас открыть еще два дополнительных порта TCP, а также два порта UDP. Мы должны были выполнить это, используя библиотеку сокетов и язык программирования Python.signal.alarm Предотвращение выполнения сценария

Поэтому я изначально сосредоточился на проблеме, которую он нам дал. Использование питона терминалу это был окончательный сценарий, прежде чем я первоначально казнен его, зная, что общие понятия откроют порты для подключения на Linux госте:

#!/usr/bin/env python 

import signal 
import socket 
import sys 
import time 
import os 

s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s3 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s4 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s5 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s6 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

def tcp_server() : 
    TCP_IP = '127.0.0.1' 

    s1.bind((TCP_IP, 6005)) 
    s2.bind((TCP_IP, 1123)) 
    s3.bind((TCP_IP, 6009)) 
    s4.bind((TCP_IP, 1124)) 
    s5.bind((TCP_IP, 6006)) 
    s6.bind((TCP_IP, 6007)) 

    s1.listen(1) 
    s2.listen(2) 
    s3.listen(3) 
    s4.listen(4) 

tcp_server() 

def SigAlarmHandler(signal, frame) : 
    print("Received alarm TCP server is shutting down") 
    sys.exit(0) 

signal.signal(signal.SIGALRM, SigAlarmHandler) 
signal.alarm(int(sys.argv[1])) 

while True : 
    pass 

Когда я выполнить скрипт на Ubuntu VM я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    signal.alarm(int(sys.argv[1])) 
IndexError: list index out of range 

Итак, я вырыл и нашел эти два маленьких самородка информации.

signal.alarm Python Docs: https://docs.python.org/2/library/signal.html

Unix человек страница сигнализации (2) http://unixhelp.ed.ac.uk/CGI/man-cgi?alarm+2

Глядя на странице человека для тревоги кажется, что она ожидает типа INT, так что я не уверен, что требуется явное преобразование данных. Хотя я также не уверен в общем направлении сценария. Профессор просто отдал его нам за бонус. Он сказал, что посмотрит на это, но я не уверен, когда он вернется ко мне.

Я думаю, что бит кода настроен так, что если один из открытых портов будет исследован, скрипт завершится. Если посмотреть на страницу man, кажется, что если возвращается int больше 0, будет генерироваться сигнал тревоги. Запуск завершения сценария. Хотя с индексом IndexError и не зная, какой индекс он имеет в виду, я не уверен, где сужаться, чтобы решить проблему.

+0

Как вы используете свой сценарий? Вы на 100% уверены, что существует sys.argv [1]? Вы можете распечатать его заранее? –

+0

Я попытался выполнить вызов, вызвав интерпретатор python, а также простой ./ScriptName.py. Я изменил строку кода для печати (signal.alarm (int (sys.argv [1]))) и все равно получает IndexError. –

ответ

1

Наиболее вероятным объяснением является то, что вы не передаете какие-либо аргументы командной строки для своего скрипта и что это sys.argv[1], что повышает значение IndexError. Ничего общего с сигналами или сокетами.

Вызовите свой скрипт с помощью ./ScriptName.py 5, и он должен работать, будильник будет срабатывать через 5 секунд, и ваш сервер должен выйти.

Ссылки в случае, если вы не знакомы с sys.argv:

+0

Благодарим вас за эту документацию. Я не знаю, почему он добавил это к этому сценарию. Хотя я думаю, что на этот раз я буду более настойчив, когда обсужу это с ним. Чтобы действительно получить полную картину того, чего он пытался достичь. –

+0

Предоставленный номер - сколько секунд сервер будет работать до того, как он выйдет. На данный момент он ничего не делает (я думаю), когда ему присваивается сокет, или ему отправляются данные UDP, поэтому он будет просто сидеть там в цикле 'while True' до тех пор, пока не загорится тревога, и в этот момент он выйдет. –

Смежные вопросы