--- id: 5e46f979ac417301a38fb932 title: 端口扫描器 challengeType: 10 forumTopicId: 462372 helpCategory: Python dashedName: port-scanner --- # --description-- 你将通过使用我们的 [Replit 入门代码](https://replit.com/github/freeCodeCamp/boilerplate-port-scanner) 来完成本项目。 我们仍在开发 Python 课程的交互式教学部分。 目前,你可以在 YouTube 上通过 freeCodeCamp.org 上传的一些视频学习这个项目相关的知识。 - [Python for Everybody 视频课程](https://www.freecodecamp.org/news/python-for-everybody/)(14 小时) - [Learn Python 视频课程](https://www.freecodecamp.org/news/learn-python-video-course/)(10 小时) # --instructions-- 使用 Python 创建一个端口扫描器。 在 `port_scanner.py` 文件中,创建一个名为 `get_open_ports` 的函数,它接受一个 `target` 参数和一个 `port_range` 参数。 `target` 可以是 URL 或 IP 地址。 `port_range` 是两个数字的列表,表示要检查的端口范围的第一个和最后一个数字。 以下是如何调用该函数的示例: ```py get_open_ports("209.216.230.240", [440, 445]) get_open_ports("www.stackoverflow.com", [79, 82]) ``` 该函数应返回给定范围内的开放端口列表。 `get_open_ports` 函数还应采用可选的第三个参数 `True` 来表示“详细”模式。 如果将其设置为 true,则该函数应返回描述性字符串而不是端口列表。 以下是详细模式下应返回的字符串格式(`{}` 中的文本表示应显示的信息): ```bash Open ports for {URL} ({IP address}) PORT SERVICE {port} {service name} {port} {service name} ``` 你可以使用 `common_ports.py` 中的字典为每个端口获取正确的服务名称。 例如,如果函数是这样调用的: ```py port_scanner.get_open_ports("scanme.nmap.org", [20, 80], True) ``` 它应该返回以下内容: ```bash Open ports for scanme.nmap.org (45.33.32.156) PORT SERVICE 22 ssh 80 http ``` 确保包含正确的间距和换行符。 如果传入 `get_open_ports` 函数的 URL 无效,该函数应返回字符串:“Error: Invalid hostname”。 如果传入 `get_open_ports` 函数的 IP 地址无效,该函数应返回字符串:“Error: Invalid IP address”。 ## 开发 在 `port_scanner.py` 中编写你的代码。 对于开发,你可以使用 `main.py` 来测试你的代码。 单击“运行”按钮,`main.py` 将运行。 ## 测试 这个项目的单元测试在 `test_module.py` 中。 为了你的方便,我们将测试从 `test_module.py` 导入到 `main.py`。 只要你点击“运行”按钮,测试就会自动运行。 ## 提交 复制项目的 URL 并将其提交给 freeCodeCamp。 # --hints-- 它应该通过所有的 Python 测试。 ```js ``` # --solutions-- ```py # Python challenges don't need solutions, # because they would need to be tested against a full working project. # Please check our contributing guidelines to learn more. ```