背景:因此我们在课堂上提供了这个脚本,目的是在我们的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并且不知道它指的是什么索引,但我不确定在哪里缩小以解决问题。
答案 0 :(得分:1)
最可能的解释是,您没有向脚本传递任何命令行参数,而且sys.argv[1]
正在引发IndexError。与信号或插座无关。
使用./ScriptName.py 5
调用您的脚本,它应该可以工作,警报会在5秒后触发,服务器应该退出。
如果您不熟悉sys.argv,请参考: