serv

package module
v0.0.0-...-c89b3a3 Latest Latest
Warning

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

Go to latest
Published: Jun 8, 2022 License: Apache-2.0 Imports: 24 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, ctx context.Context) (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(channel gosshd.Channel, copyReadTo io.Writer) (*copyOnReadConn, error)

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

func NewCopyOnWriteConn

func NewCopyOnWriteConn(channel gosshd.Channel, copyWriteTo io.Writer) (*copyWhenWrite, error)

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

func Open

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

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 CreateSessionCallback

type CreateSessionCallback func(gosshd.Context, gosshd.Channel) gosshd.Channel

type DefaultSessionChanHandler

type DefaultSessionChanHandler struct {
	sync.Mutex

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

DefaultSessionChanHandler 一个处理 Channel 类型 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) Env

func (handler *DefaultSessionChanHandler) Env() []string

Env 获取设置的环境变量

func (*DefaultSessionChanHandler) HandleEnvReq

func (handler *DefaultSessionChanHandler) HandleEnvReq(ctx gosshd.Context, request gosshd.Request, session gosshd.Channel) error

func (*DefaultSessionChanHandler) HandleExecReq

func (handler *DefaultSessionChanHandler) HandleExecReq(ctx gosshd.Context, request gosshd.Request, session gosshd.Channel) error

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

func (*DefaultSessionChanHandler) HandleExit

func (handler *DefaultSessionChanHandler) HandleExit(ctx gosshd.Context, request gosshd.Request, session gosshd.Channel) error

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

func (*DefaultSessionChanHandler) HandlePtyReq

func (handler *DefaultSessionChanHandler) HandlePtyReq(ctx gosshd.Context, request gosshd.Request, session gosshd.Channel) error

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

func (*DefaultSessionChanHandler) HandleShellReq

func (handler *DefaultSessionChanHandler) HandleShellReq(ctx gosshd.Context, request gosshd.Request, session gosshd.Channel) error

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

func (*DefaultSessionChanHandler) HandleSignalReq

func (handler *DefaultSessionChanHandler) HandleSignalReq(ctx gosshd.Context, request gosshd.Request, session gosshd.Channel) error

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

func (*DefaultSessionChanHandler) HandleWinChangeReq

func (handler *DefaultSessionChanHandler) HandleWinChangeReq(ctx gosshd.Context, request gosshd.Request, session gosshd.Channel) error

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

func (*DefaultSessionChanHandler) PtyMsg

func (handler *DefaultSessionChanHandler) PtyMsg() <-chan *gosshd.PtyRequestMsg

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

func (*DefaultSessionChanHandler) PutPtyMsg

func (handler *DefaultSessionChanHandler) PutPtyMsg(msg *gosshd.PtyRequestMsg)

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

func (*DefaultSessionChanHandler) PutSignalMsg

func (handler *DefaultSessionChanHandler) PutSignalMsg(msg *gosshd.SignalMsg)

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

func (*DefaultSessionChanHandler) PutWinchMsg

func (handler *DefaultSessionChanHandler) PutWinchMsg(msg *gosshd.PtyWindowChangeMsg)

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

func (*DefaultSessionChanHandler) SendExitStatus

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

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

func (*DefaultSessionChanHandler) ServeRequest

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

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

func (*DefaultSessionChanHandler) SetDefaults

func (handler *DefaultSessionChanHandler) SetDefaults()

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

func (*DefaultSessionChanHandler) SetEnv

func (handler *DefaultSessionChanHandler) SetEnv(env []string)

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

func (*DefaultSessionChanHandler) SetReqHandlerFunc

func (handler *DefaultSessionChanHandler) SetReqHandlerFunc(reqtype string, f RequestHandlerFunc)

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

func (*DefaultSessionChanHandler) SignalMsg

func (handler *DefaultSessionChanHandler) SignalMsg() <-chan *gosshd.SignalMsg

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

func (*DefaultSessionChanHandler) Start

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

func (*DefaultSessionChanHandler) WinchMsg

func (handler *DefaultSessionChanHandler) WinchMsg() <-chan *gosshd.PtyWindowChangeMsg

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

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(ctx gosshd.Context, request gosshd.Request)

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(ctx gosshd.Context, request gosshd.Request)

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

func (*ForwardedTcpIpRequestHandler) ServeForward

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

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

type ReqLogCallback

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

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

type RequestHandlerFunc

type RequestHandlerFunc func(ctx gosshd.Context, request gosshd.Request, session gosshd.Channel) error

RequestHandlerFunc 处理单个请求

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(ctx gosshd.Context, newChannel gosshd.NewChannel)

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