Lua中如何使用 实现扫描信息的行覆盖输出?
Lua端口扫描终端输出优化方案
你的核心需求是让开放端口信息保留显示,同时让Scanning...始终在终端最后一行动态刷新,避免每次换行重复显示。以下是修改后的代码及原理说明:
修改后的代码
local socket = require("socket") io.write("Starting scan...\n") io.flush() for port = 1, 65535 do -- 动态刷新当前扫描状态到终端最后一行 io.write(string.format("Scanning port %d...\r", port)) io.flush() local sock = socket.tcp() sock:settimeout(0.1) -- 设置短超时,提升扫描效率 local success = sock:connect("192.168.88.1", port) if success then -- 换行输出开放端口信息,避免覆盖扫描状态 io.write("\n[\27[1m\27[91m+\27[0m] Open port: " .. port) io.flush() end sock:close() end io.write("\nScan completed!\n")
关键优化点说明
- 替换
print为io.write:print会自动添加换行符,导致每次输出都换行;io.write可以手动控制输出格式,配合\r实现同一行内容覆盖。 - 利用
\r回车符:\r会将光标移到当前行开头,后续输出会覆盖该行原有内容,实现Scanning...的动态刷新效果。 - 强制刷新缓冲区
io.flush():终端输出默认有缓冲机制,调用io.flush()能确保内容立即显示,避免延迟。 - 添加连接超时:
sock:settimeout(0.1)设置短超时时间,避免单个端口连接阻塞太久,大幅提升扫描速度。
效果说明
运行后,终端会逐行保留所有开放端口的信息,同时最后一行持续显示当前扫描的端口状态,不会重复换行打印Scanning...,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Saviam
相关产品推荐
相关产品推荐

