You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua实现SSH/Telnet连接超时返回false的方法咨询

Lua实现SSH/Telnet连接超时返回false的方案

一、利用网络库内置超时(推荐)

大部分Lua网络库(比如LuaSocket、lua-ssh)都自带超时配置,直接设置即可,无需手动处理hook,代码更简洁可靠。

1. Telnet连接(基于LuaSocket)

local socket = require("socket")

function connect_telnet(host, port, timeout_sec)
    local tcp = socket.tcp()
    -- 设置连接超时时间(单位:秒),比如X分钟就是X*60
    tcp:settimeout(timeout_sec)
    
    local success, err = tcp:connect(host, port)
    if not success then
        -- 超时或连接失败,返回false
        tcp:close()
        return false, err
    end
    
    -- 连接成功,返回socket对象
    return tcp
end

-- 示例:设置5分钟超时(300秒)
local conn = connect_telnet("192.168.1.1", 23, 300)
if not conn then
    print("连接超时或失败")
end

2. SSH连接(基于lua-ssh库)

lua-ssh(基于libssh2的绑定)通常支持在创建session时设置超时:

local ssh = require("ssh")

function connect_ssh(host, port, user, password, timeout_sec)
    local session, err = ssh.new()
    if not session then return false, err end
    
    -- 设置连接超时(部分库用毫秒单位)
    session:set_timeout(timeout_sec * 1000)
    
    local success, err = session:connect(host, port or 22)
    if not success then
        session:free()
        return false, err
    end
    
    -- 密码认证逻辑
    success, err = session:auth_password(user, password)
    if not success then
        session:disconnect()
        session:free()
        return false, err
    end
    
    return session
end

-- 示例:设置3分钟超时(180秒)
local ssh_conn = connect_ssh("192.168.1.2", 22, "admin", "pass", 180)
if not ssh_conn then
    print("SSH连接超时或失败")
end

二、用Coroutine + Debug Hook实现通用超时(适用于无内置超时的阻塞函数)

如果你的连接函数没有内置超时,或是第三方阻塞逻辑,可以用协程配合debug hook强制中断执行:

function with_timeout(timeout_sec, func, ...)
    local co = coroutine.create(func)
    local timeout = false
    local timeout_deadline = os.time() + timeout_sec

    -- 设置debug hook,每隔100ms检查一次超时
    debug.sethook(function()
        if os.time() >= timeout_deadline then
            timeout = true
            -- 强制终止协程
            coroutine.close(co)
        end
    end, "", 100)
    
    local success, result = coroutine.resume(co, ...)
    
    -- 关闭hook,避免影响后续逻辑
    debug.sethook()
    
    if timeout or not success then
        return false
    end
    
    return result
end

-- 示例:包装自定义阻塞连接函数
function my_blocking_connect(host, port)
    -- 这里是你的阻塞连接逻辑(无内置超时的SSH/Telnet调用)
    local conn = some_blocking_lib.connect(host, port)
    return conn
end

-- 设置5分钟超时(300秒)调用
local conn = with_timeout(300, my_blocking_connect, "192.168.1.3", 23)
if not conn then
    print("连接超时")
end

注意事项

  • 若阻塞函数是C实现且不允许中断,debug hook可能无法强制终止(底层C阻塞调用不会让出Lua虚拟机控制权),这种情况优先用库内置超时。
  • 协程终止后需确保资源被正确释放(比如关闭未完成的连接句柄),避免内存泄漏。

内容的提问来源于stack exchange,提问作者Caio Borges

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 02:35:09