go - 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
我该怎么做?
解决方案
首先,我觉得你采取的方法有点奇怪。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 的异常处理。祝你好运!
推荐阅读
- powerbi - 将 Power BI 报告嵌入到 Angular 应用程序中
- python - 多处理以加快python中的执行时间
- javascript - 投票史诗行为
- python - 了解列表与系列中的 Python 语法
- amazon-web-services - CodenameOne 移动应用程序使用真实证书(非自签名)连接到 https 服务器时抛出 SSL 异常
- git - 合并时 Git 似乎使用不正确的祖先作为基础
- swift - 如何找到与 x [Swift] 差异最小的字典值
- sql - 使用 azure data studio 导入 csv 文件无法正常工作
- javascript - 如何将 SSO 页面(MSAL 身份验证)login.aspx(单个页面,不在母版页下)重定向到另一个页面 Home.aspx(母版页中的内容)?
- angular - 如何在 Angular DatePipe 月份缩写中不显示期间