signal.alarm防止脚本执行

时间:2014-08-29 01:25:08

标签: python sockets alarm

背景:因此我们在课堂上提供了这个脚本,目的是在我们的Ubuntu VM上打开随机非特权端口。他给了我们两个TCP示例,并要求我们再打开两个额外的TCP端口以及两个UDP端口。我们要使用套接字库和Python编程语言来实现这一目标。

所以我最初专注于他给我们的问题。使用python终端这是我最初执行它之前的最终脚本,知道一般概念会打开Linux guest虚拟机上的连接端口:

#!/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文档: https://docs.python.org/2/library/signal.html

Unix手册页报警(2) http://unixhelp.ed.ac.uk/CGI/man-cgi?alarm+2

查看警报的手册页,似乎期待一个int类型,所以我不相信显式数据转换是必要的。虽然我对脚本的总体方向也没有信心。教授刚给我们奖金。他说他会看着它,但我不确定他什么时候回到我身边。

我认为设置了一些代码,如果探测到其中一个端口被探测,脚本将终止。查看手册页似乎如果返回大于0的int,则会生成警报。触发脚本终止。虽然有一个IndexError并且不知道它指的是什么索引,但我不确定在哪里缩小以解决问题。

1 个答案:

答案 0 :(得分:1)

最可能的解释是,您没有向脚本传递任何命令行参数,而且sys.argv[1]正在引发IndexError。与信号或插座无关。

使用./ScriptName.py 5调用您的脚本,它应该可以工作,警报会在5秒后触发,服务器应该退出。

如果您不熟悉sys.argv,请参考: