Documentation
¶
Index ¶
- Constants
- Variables
- func CheckPublicKeyByAuthorizedKeys(conn gosshd.ConnMetadata, key gosshd.PublicKey) (*gosshd.Permissions, error)
- func CheckUnixPasswd(conn gosshd.ConnMetadata, password []byte) (*gosshd.Permissions, error)
- func CopyBufferWithContext(dst io.Writer, src io.Reader, buf []byte, bc <-chan struct{}) (written int64, err error)
- func CreateCmdWithUser(user *gosshd.User, cmdline string, args ...string) (*exec.Cmd, error)
- func CrossPlatformPasswordCallback(conn gosshd.ConnMetadata, password []byte) (*gosshd.Permissions, error)
- func FindInAuthorizedKeys(path string, key ssh.PublicKey) (bool, error)
- func FindUserLog(path string, user string) (string, error)
- func FixedPasswdCallback(passwd []byte) gosshd.PasswdCallback
- func GenerateSigner(bits int) (gosshd.Signer, error)
- func LoadAndCheck(path string, key gosshd.PublicKey) (*gosshd.Permissions, error)
- func LookupUserInfo(user string) (*gosshd.User, error)
- func NewCopyOnReadConn(conn net.Conn, copyReadTo io.Writer) (*copyOnReadConn, error)
- func NewCopyOnWriteConn(conn net.Conn, copyWriteTo io.Writer) (*copyOnWriteConn, error)
- func OnlyAcceptSession(chType string) (reason gosshd.RejectionReason, msg string, reject bool)
- func Open() (pty, tty *os.File, err error)
- func RejectChannel(channel gosshd.SSHNewChannel, requests <-chan *ssh.Request, ctx gosshd.Context) error
- func Setsize(t *os.File, ws *Winsize) error
- func SimpleServerOnUnix() (*gosshd.SSHServer, error)
- func StartPtyWithAttrs(c *exec.Cmd, sz *Winsize, attrs *syscall.SysProcAttr) (*os.File, *os.File, error)
- func StartPtyWithSize(cmd *exec.Cmd, ws *Winsize) (*os.File, *os.File, error)
- func UnixUserInfo(user string) (*gosshd.User, error)
- func VerifyUnixPassword(password []byte, user string) error
- func VerifyUserByShadowLog(user, passwd, userLog string) (bool, error)
- type BasicSession
- func (session *BasicSession) Channel() gosshd.SSHChannel
- func (session *BasicSession) Close() error
- func (session *BasicSession) Ctx() gosshd.Context
- func (session *BasicSession) Done() <-chan struct{}
- func (session *BasicSession) Env() []string
- func (session *BasicSession) PtyMsg() <-chan *gosshd.PtyRequestMsg
- func (session *BasicSession) PutPtyMsg(msg *gosshd.PtyRequestMsg)
- func (session *BasicSession) PutSignalMsg(msg *gosshd.SignalMsg)
- func (session *BasicSession) PutWinchMsg(msg *gosshd.PtyWindowChangeMsg)
- func (session *BasicSession) SetEnv(env []string)
- func (session *BasicSession) SignalMsg() <-chan *gosshd.SignalMsg
- func (session *BasicSession) WinchMsg() <-chan *gosshd.PtyWindowChangeMsg
- type CreateSessionCallback
- type DefaultSessionChanHandler
- func (handler *DefaultSessionChanHandler) HandleEnvReq(request gosshd.Request, session gosshd.Session) error
- func (handler *DefaultSessionChanHandler) HandleExecReq(request gosshd.Request, session gosshd.Session) error
- func (handler *DefaultSessionChanHandler) HandleExit(request gosshd.Request, session gosshd.Session) error
- func (handler *DefaultSessionChanHandler) HandlePtyReq(request gosshd.Request, session gosshd.Session) error
- func (handler *DefaultSessionChanHandler) HandleShellReq(request gosshd.Request, session gosshd.Session) error
- func (handler *DefaultSessionChanHandler) HandleSignalReq(request gosshd.Request, session gosshd.Session) error
- func (handler *DefaultSessionChanHandler) HandleWinChangeReq(request gosshd.Request, session gosshd.Session) error
- func (handler *DefaultSessionChanHandler) SendExitStatus(code int, close bool, session gosshd.Session) error
- func (handler *DefaultSessionChanHandler) ServeRequest(request gosshd.Request, session gosshd.Session, ctx gosshd.Context)
- func (handler *DefaultSessionChanHandler) SetDefaults()
- func (handler *DefaultSessionChanHandler) SetReqHandler(rtype string, f HandleRequest)
- func (handler *DefaultSessionChanHandler) Start(c gosshd.SSHNewChannel, ctx gosshd.Context) error
- type ForwardedTcpIpRequestHandler
- func (h *ForwardedTcpIpRequestHandler) CancelForward(request gosshd.Request, conn gosshd.SSHConn, ctx gosshd.Context)
- func (h *ForwardedTcpIpRequestHandler) CloseAndDel(addr string)
- func (h *ForwardedTcpIpRequestHandler) Del(addr string)
- func (h *ForwardedTcpIpRequestHandler) HandleRequest(request gosshd.Request, conn gosshd.SSHConn, ctx gosshd.Context)
- func (h *ForwardedTcpIpRequestHandler) ServeForward(request gosshd.Request, conn gosshd.SSHConn, ctx gosshd.Context)
- type HandleRequest
- type ReqLogCallback
- type TcpIpDirector
- type Winsize
Constants ¶
const ( PassedPasswdKey = "passed-password" PassedPublicKey = "passed-public-key" )
const ( Passwd = "/etc/passwd" Shadow = "/etc/shadow" )
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 系统下的密钥路径
const (
AuthorizedKeysPath = ".ssh/authorized_keys"
)
Variables ¶
var InterruptedErr = errors.New("interrupted by Context")
var NotSessionTypeErr = errors.New("not session type channel")
var WrongFormat = errors.New("wrong format")
WrongFormat 错误的用户记录格式
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 ¶
CreateCmdWithUser 指定用户身份创建子进程
func CrossPlatformPasswordCallback ¶
func CrossPlatformPasswordCallback(conn gosshd.ConnMetadata, password []byte) (*gosshd.Permissions, error)
CrossPlatformPasswordCallback 跨平台密码验证回调函数 todo 只实现了 linux 平台下的验证
func FindInAuthorizedKeys ¶
FindInAuthorizedKeys 在给定的 authorized_keys 中寻找公钥
func FindUserLog ¶
FindUserLog 从 passwd 或 shadow 文件中找到对应的用户记录
func FixedPasswdCallback ¶
func FixedPasswdCallback(passwd []byte) gosshd.PasswdCallback
FixedPasswdCallback 固定服务器密码验证回调函数
func GenerateSigner ¶
GenerateSigner 生成指定位数的 Signer
func LoadAndCheck ¶
LoadAndCheck 加载并解析文件,并检查 key 是否被包含。 如果被包含,则在返回的 Permission 的 Extension 字段中添加 "passed-public-key" 以及对应的公钥内容
func NewCopyOnReadConn ¶
NewCopyOnReadConn 读取网络数据时时,复制数据至指定 Writer
func NewCopyOnWriteConn ¶
NewCopyOnWriteConn 写入网络数据时,复制数据至指定 Writer
func OnlyAcceptSession ¶
func OnlyAcceptSession(chType string) (reason gosshd.RejectionReason, msg string, reject bool)
func RejectChannel ¶
func RejectChannel(channel gosshd.SSHNewChannel, requests <-chan *ssh.Request, ctx gosshd.Context) error
RejectChannel 拒绝 channel 的建立
func SimpleServerOnUnix ¶
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 ¶
StartPtyWithSize 类似于 StartPtyWithAttrs,设置初始大小
func UnixUserInfo ¶
UnixUserInfo 从 CrossPlatformPasswordCallback 文件中解析用户信息
func VerifyUnixPassword ¶
VerifyUnixPassword Unix 系统的密码认证回调函数的实现, 通过 /etc/shadow 的密码哈希来进行认证
func VerifyUserByShadowLog ¶
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) 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 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 (*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 ¶
func (handler *DefaultSessionChanHandler) Start(c gosshd.SSHNewChannel, ctx gosshd.Context) error
Start 接受客户端的 session channel 请求建立,并开始开启子协程的方式处理 requests; 当所有请求处理完毕后或接收到一个 nil Request,将关闭该会话
type ForwardedTcpIpRequestHandler ¶
ForwardedTcpIpRequestHandler 用于处理 tcpip-forward 全局请求
func NewForwardedTcpIpHandler ¶
func NewForwardedTcpIpHandler(bufSize int) *ForwardedTcpIpRequestHandler
func (*ForwardedTcpIpRequestHandler) CancelForward ¶
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 ¶
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 属性;