登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-06 22:21:35 164浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《golang使用ssh连接ssh并打印错误异常》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

我想将python代码转换为golang版本,这是我的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代码版本相同的异常,除了invalidusername:paramiko.ssh_exception.authenticationexception,我该怎么做?


解决方案


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

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

在您提供的 go 演示链接中,可以讨论很多事情 - 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并打印错误异常》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>