diff --git a/internal/sftp/client.go b/internal/sftp/client.go index c392f7c..93c069e 100644 --- a/internal/sftp/client.go +++ b/internal/sftp/client.go @@ -4,6 +4,7 @@ import ( "fmt" "net" "os" + "strconv" "sync" "time" @@ -157,7 +158,8 @@ func buildClient(config *Config) (*Client, error) { return nil, &ConnectionError{Op: "auth", Err: fmt.Errorf("必须提供密码或密钥文件")} } - addr := fmt.Sprintf("%s:%d", config.Host, config.Port) + // JoinHostPort 保证 IPv6 主机地址被方括号包裹,fmt 拼接对 IPv6 产生非法地址 + addr := net.JoinHostPort(config.Host, strconv.Itoa(config.Port)) // 拨号与认证、SFTP 子系统握手共享同一总超时预算,认证阶段无界挂起由 deadline 掐断 deadline := time.Now().Add(connectTimeout) sshConn, err := net.DialTimeout("tcp", addr, connectTimeout)