utils

package module
v0.0.0-...-50847ff Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 9, 2022 License: Apache-2.0 Imports: 25 Imported by: 0

Documentation

Index

Constants

View Source
const (
	PassedPasswdKey = "passed-password"
	PassedPublicKey = "passed-public-key"
)
View Source
const (
	Passwd = "/etc/passwd"
	Shadow = "/etc/shadow"
)
View Source
const (
	RSAHostKeyPath     = "/etc/ssh/ssh_host_rsa_key"
	ECDSAHostKeyPath   = "/etc/ssh/ssh_host_ecdsa_key"
	ED25519HostKeyPath = "/etc/ssh/ssh_host_ed25519_key"
	DSAHostKeyPath     = "/etc/ssh/ssh_host_dsa_key"

	RSAHostPublicKeyPath     = "/etc/ssh/ssh_host_rsa_key.pub"
	ECDSAHostPublicKeyPath   = "/etc/ssh/ssh_host_ecdsa_key.pub"
	ED25519HostPublicKeyPath = "/etc/ssh/ssh_host_ed25519_key.pub"
	DSAHostPublicKeyPath     = "/etc/ssh/ssh_host_dsa_key.pub"
)

OpenSSH 在 unix 系统下的密钥路径

View Source
const (
	AuthorizedKeysPath = ".ssh/authorized_keys"
)

Variables

View Source
var InterruptedErr = errors.New("interrupted by Context")
View Source
var NotSessionTypeErr = errors.New("not session type channel")
View Source
var WrongFormat = errors.New("wrong format")

WrongFormat 错误的用户记录格式

View Source
var WrongPassword = errors.New("wrong password")

WrongPassword 错误的密码

Functions

func CheckPublicKeyByAuthorizedKeys

func CheckPublicKeyByAuthorizedKeys(conn gosshd.ConnMetadata, key gosshd.PublicKey) (*gosshd.Permissions, error)

CheckPublicKeyByAuthorizedKeys 检查客户端发送的公钥是否在 `authorized_keys` 中

func CheckUnixPasswd

func CheckUnixPasswd(conn gosshd.ConnMetadata, password []byte) (*gosshd.Permissions, error)

CheckUnixPasswd 通过 Unix 系统下的 passwd 与 shadow 文件,校验用户密码;返回的 Permissions.Extensions 中包含 ‘passed-password’ 以及密码信息

func CopyBufferWithContext

func CopyBufferWithContext(dst io.Writer, src io.Reader, buf []byte, bc <-chan struct{}) (written int64, err error)

CopyBufferWithContext 导出的 io.CopyBufferWithContext 函数,可传入 Context 对应的 cancelFunc 来终止流之间的复制

func CreateCmdWithUser

func CreateCmdWithUser(user *gosshd.User, cmdline string, args ...string) (*exec.Cmd, error)

CreateCmdWithUser 指定用户身份创建子进程

func CrossPlatformPasswordCallback

func CrossPlatformPasswordCallback(conn gosshd.ConnMetadata, password []byte) (*gosshd.Permissions, error)

CrossPlatformPasswordCallback 跨平台密码验证回调函数 todo 只实现了 linux 平台下的验证

func FindInAuthorizedKeys

func FindInAuthorizedKeys(path string, key ssh.PublicKey) (bool, error)

FindInAuthorizedKeys 在给定的 authorized_keys 中寻找公钥

func FindUserLog

func FindUserLog(path string, user string) (string, error)

FindUserLog 从 passwd 或 shadow 文件中找到对应的用户记录

func FixedPasswdCallback

func FixedPasswdCallback(passwd []byte) gosshd.PasswdCallback

FixedPasswdCallback 固定服务器密码验证回调函数

func GenerateSigner

func GenerateSigner(bits int) (gosshd.Signer, error)

GenerateSigner 生成指定位数的 Signer

func LoadAndCheck

func LoadAndCheck(path string, key gosshd.PublicKey) (*gosshd.Permissions, error)

LoadAndCheck 加载并解析文件,并检查 key 是否被包含。 如果被包含,则在返回的 Permission 的 Extension 字段中添加 "passed-public-key" 以及对应的公钥内容

func LookupUserInfo

func LookupUserInfo(user string) (*gosshd.User, error)

func NewCopyOnReadConn

func NewCopyOnReadConn(conn net.Conn, copyReadTo io.Writer) (*copyOnReadConn, error)

NewCopyOnReadConn 读取网络数据时时,复制数据至指定 Writer

func NewCopyOnWriteConn

func NewCopyOnWriteConn(conn net.Conn, copyWriteTo io.Writer) (*copyOnWriteConn, error)

NewCopyOnWriteConn 写入网络数据时,复制数据至指定 Writer

func OnlyAcceptSession

func OnlyAcceptSession(chType string) (reason gosshd.RejectionReason, msg string, reject bool)

func Open

func Open() (pty, tty *os.File, err error)

func RejectChannel

func RejectChannel(channel gosshd.SSHNewChannel, requests <-chan *ssh.Request, ctx gosshd.Context) error

RejectChannel 拒绝 channel 的建立

func Setsize

func Setsize(t *os.File, ws *Winsize) error

func SimpleServerOnUnix

func SimpleServerOnUnix() (*gosshd.SSHServer, error)

SimpleServerOnUnix 创建一个默认的 ssh server 实例,所有的处理器均为默认处理器 使用 Open-SSH 服务器密钥作为主机密钥;只适用于 Unix 系统

func StartPtyWithAttrs

func StartPtyWithAttrs(c *exec.Cmd, sz *Winsize, attrs *syscall.SysProcAttr) (*os.File, *os.File, error)

StartPtyWithAttrs 返回创建 pty、tty,将 cmd 的输入输出绑定到 tty,然后返回对应的 pty,tty

func StartPtyWithSize

func StartPtyWithSize(cmd *exec.Cmd, ws *Winsize) (*os.File, *os.File, error)

StartPtyWithSize 类似于 StartPtyWithAttrs,设置初始大小

func UnixUserInfo

func UnixUserInfo(user string) (*gosshd.User, error)

UnixUserInfo 从 CrossPlatformPasswordCallback 文件中解析用户信息

func VerifyUnixPassword

func VerifyUnixPassword(password []byte, user string) error

VerifyUnixPassword Unix 系统的密码认证回调函数的实现, 通过 /etc/shadow 的密码哈希来进行认证

func VerifyUserByShadowLog

func VerifyUserByShadowLog(user, passwd, userLog string) (bool, error)

VerifyUserByShadowLog 通过 openssl passwd 模块验证 用户提供的密码是否符合 shadow 文件中对应的记录 fixme 不应该借助外部程序来进行验证

Types

type BasicSession

type BasicSession struct {
	sync.Mutex // 修改值时的信号量
	gosshd.SSHChannel
	gosshd.Context
	// contains filtered or unexported fields
}

func (*BasicSession) Channel

func (session *BasicSession) Channel() gosshd.SSHChannel

Channel 获取 Session 的底层通道 SSHChannel

func (*BasicSession) Close

func (session *BasicSession) Close() error

Close 调用 cancel 并关闭 SSHChannel

func (*BasicSession) Ctx

func (session *BasicSession) Ctx() gosshd.Context

func (*BasicSession) Done

func (session *BasicSession) Done() <-chan struct{}

Done 类似于 Context#Done() 方法,返回一个管道,用于取消该 Session 关联的所有的子协程

func (*BasicSession) Env

func (session *BasicSession) Env() []string

Env 获取设置的环境变量

func (*BasicSession) PtyMsg

func (session *BasicSession) PtyMsg() <-chan *gosshd.PtyRequestMsg

PtyMsg 从缓存队列中取出最新的 pty-req 请求信息,若无,则阻塞至一个客户端发送一个新的 pty-req 请求

func (*BasicSession) PutPtyMsg

func (session *BasicSession) PutPtyMsg(msg *gosshd.PtyRequestMsg)

PutPtyMsg 放入 pty-req 请求信息至缓存队列中,若队列满,则阻塞至一个 pty-req 请求被取出

func (*BasicSession) PutSignalMsg

func (session *BasicSession) PutSignalMsg(msg *gosshd.SignalMsg)

PutSignalMsg 放入 signal 请求信息至缓存队列中,若队列满,则阻塞至一个 signal 请求被取出

func (*BasicSession) PutWinchMsg

func (session *BasicSession) PutWinchMsg(msg *gosshd.PtyWindowChangeMsg)

PutWinchMsg 放入 window-change 请求信息至缓存队列中,若队列满,则阻塞至一个 window-change 请求被取出

func (*BasicSession) SetEnv

func (session *BasicSession) SetEnv(env []string)

SetEnv 设置环境变量,单个的形式应该为 %s=%s

func (*BasicSession) SignalMsg

func (session *BasicSession) SignalMsg() <-chan *gosshd.SignalMsg

SignalMsg 从缓存队列中取出最新的 signal 请求信息,若无,则阻塞至一个客户端发送一个新的 signal 请求

func (*BasicSession) WinchMsg

func (session *BasicSession) WinchMsg() <-chan *gosshd.PtyWindowChangeMsg

WinchMsg 从缓存队列中取出最新的 window-change 请求信息,若无,则阻塞至一个客户端发送一个新的 window-change 请求

type CreateSessionCallback

type CreateSessionCallback func(gosshd.SSHChannel, gosshd.Context) gosshd.Session

type DefaultSessionChanHandler

type DefaultSessionChanHandler struct {
	sync.Mutex

	ReqHandlers map[string]HandleRequest
	ReqLogCallback
	// contains filtered or unexported fields
}

DefaultSessionChanHandler 一个处理 Session 类型 SSH 通道的 ChannelHandler

func NewSessionChannelHandler

func NewSessionChannelHandler(winMsgBufSize, ptyMsgBufSize, sigMsgBufSize, copyBufSize int) *DefaultSessionChanHandler

NewSessionChannelHandler 创建一个 DefaultSessionChanHandler。 winMsgBufSize 为 window-change 消息队列最大长度; ptyMsgBufSize 为 pty-req 消息队列最大长度; sigMsgBufSize 为 signal 消息队列最大长度; copyBuf 用于客户端 与 session 数据流的缓存; 注意:消息队列最大长度设置的太小,容易导致死锁。

func (*DefaultSessionChanHandler) HandleEnvReq

func (handler *DefaultSessionChanHandler) HandleEnvReq(request gosshd.Request, session gosshd.Session) error

func (*DefaultSessionChanHandler) HandleExecReq

func (handler *DefaultSessionChanHandler) HandleExecReq(request gosshd.Request, session gosshd.Session) error

HandleExecReq 处理 exec 请求,处理完毕后 session 将被关闭

func (*DefaultSessionChanHandler) HandleExit

func (handler *DefaultSessionChanHandler) HandleExit(request gosshd.Request, session gosshd.Session) error

HandleExit 接受退出请求,并关闭 Session

func (*DefaultSessionChanHandler) HandlePtyReq

func (handler *DefaultSessionChanHandler) HandlePtyReq(request gosshd.Request, session gosshd.Session) error

HandlePtyReq 解析 pty-req 请求,将信息存入 session 缓存队列中

func (*DefaultSessionChanHandler) HandleShellReq

func (handler *DefaultSessionChanHandler) HandleShellReq(request gosshd.Request, session gosshd.Session) error

HandleShellReq login -f 登陆用户,子进程打开错误或者处理完毕后 session 将被关闭; todo 没有对 RFC 4254 8. 规定的 Encoding of Terminal Modes 进行处理

func (*DefaultSessionChanHandler) HandleSignalReq

func (handler *DefaultSessionChanHandler) HandleSignalReq(request gosshd.Request, session gosshd.Session) error

HandleSignalReq 解析客户端发送的窗口变换消息队列,并将其传入 session 窗口消息队列中 根据 RFC 4254 6.9. signal 类型请求不需要回复

func (*DefaultSessionChanHandler) HandleWinChangeReq

func (handler *DefaultSessionChanHandler) HandleWinChangeReq(request gosshd.Request, session gosshd.Session) error

HandleWinChangeReq 解析客户端发送的窗口变换消息队列,并将其传入 session 窗口消息队列中 根据 RFC 4254 6.7. window-change 类型请求不需要回复

func (*DefaultSessionChanHandler) SendExitStatus

func (handler *DefaultSessionChanHandler) SendExitStatus(code int, close bool, session gosshd.Session) error

SendExitStatus 发送 exit-status 请求,但 close 为 true 时,会关闭 BasicSession, 当 close 为 false 时,返回请求发送时出现的错误;否则返回关闭 session 时的发送的错误

func (*DefaultSessionChanHandler) ServeRequest

func (handler *DefaultSessionChanHandler) ServeRequest(request gosshd.Request, session gosshd.Session, ctx gosshd.Context)

ServeRequest 从注册的请求处理函数中找到对应请求类型的函数,并调用; 处理函数返回的错误将被用于 handler 的 ReqLogCallback

func (*DefaultSessionChanHandler) SetDefaults

func (handler *DefaultSessionChanHandler) SetDefaults()

SetDefaults 注册默认的请求处理函数

func (*DefaultSessionChanHandler) SetReqHandler

func (handler *DefaultSessionChanHandler) SetReqHandler(rtype string, f HandleRequest)

SetReqHandler 添加一个对应请求类型的处理函数

func (*DefaultSessionChanHandler) Start

Start 接受客户端的 session channel 请求建立,并开始开启子协程的方式处理 requests; 当所有请求处理完毕后或接收到一个 nil Request,将关闭该会话

type ForwardedTcpIpRequestHandler

type ForwardedTcpIpRequestHandler struct {
	sync.Mutex
	// contains filtered or unexported fields
}

ForwardedTcpIpRequestHandler 用于处理 tcpip-forward 全局请求

func NewForwardedTcpIpHandler

func NewForwardedTcpIpHandler(bufSize int) *ForwardedTcpIpRequestHandler

func (*ForwardedTcpIpRequestHandler) CancelForward

func (h *ForwardedTcpIpRequestHandler) CancelForward(request gosshd.Request, conn gosshd.SSHConn, ctx gosshd.Context)

func (*ForwardedTcpIpRequestHandler) CloseAndDel

func (h *ForwardedTcpIpRequestHandler) CloseAndDel(addr string)

CloseAndDel 删除并关闭对应地址的 listener

func (*ForwardedTcpIpRequestHandler) Del

func (h *ForwardedTcpIpRequestHandler) Del(addr string)

Del 删除对应地址的 listener

func (*ForwardedTcpIpRequestHandler) HandleRequest

func (h *ForwardedTcpIpRequestHandler) HandleRequest(request gosshd.Request, conn gosshd.SSHConn, ctx gosshd.Context)

HandleRequest 可用于注册 tcpip-forward 与 cancel-tcpip-forward 类型的全局请求的处理函数

func (*ForwardedTcpIpRequestHandler) ServeForward

func (h *ForwardedTcpIpRequestHandler) ServeForward(request gosshd.Request, conn gosshd.SSHConn, ctx gosshd.Context)

ServeForward 处理 tcpip-forward 全局请求,监听请求消息中的地址与端口; 每当监听到一个新的网络连接,就向客户端发送一个 forwarded-tcpip 通道建立请求,转发连接内容

type HandleRequest

type HandleRequest func(request gosshd.Request, session gosshd.Session) error

HandleRequest 处理单个请求

type ReqLogCallback

type ReqLogCallback func(err error, rtype string, wantReply bool, payload []byte, context gosshd.Context)

ReqLogCallback 用于记录接受的请求,处理结果 err 为处理函数返回的错误;rtype 为请求类型;wantReply 为是否需要回应客户端;payload 为请求附带的数据

type TcpIpDirector

type TcpIpDirector struct {
	// contains filtered or unexported fields
}

TcpIpDirector direct-tcpip 类型的 channel 处理。 客户端将会监听发送至本地 local-addr:local-port 并向远程服务器发送一个 direct-tcpip 通道建立请求, 之后将数据转发至 remote-addr:remote-port

func NewTcpIpDirector

func NewTcpIpDirector(timeout time.Duration) *TcpIpDirector

func (*TcpIpDirector) HandleDirectTcpIP

func (d *TcpIpDirector) HandleDirectTcpIP(newChannel gosshd.SSHNewChannel, ctx gosshd.Context)

HandleDirectTcpIP 开始处理一个 direct-tcpip 类型的信道,连接客户端发送的目标网络,并连接双方。 net.DialTimeout 将会被调用,timeout 为 d 的 timeout 属性;

type Winsize

type Winsize struct {
	Rows uint16 // ws_row: Number of rows (in cells)
	Cols uint16 // ws_col: Number of columns (in cells)
	X    uint16 // ws_xpixel: Width in pixels
	Y    uint16 // ws_ypixel: Height in pixels
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL