我使用&ssh.ServerConfig{
NoClientAuth: false,
PublicKeyCallback: func(c ssh.ConnMetadata, pk ssh.PublicKey) (*ssh.Permissions, error) {
pkstr := string(pk.Marshal())
akmu.Lock()
defer akmu.Unlock()
if _, ok := authorizedKeys[pkstr]; ok {
authorizedKeys[pkstr].last = time.Now()
return nil, nil
}
return nil, errors.New("unauthorized public key")
},
}
库在Go中实现了一个SSH服务器守护程序,我想实现"最后一次登录消息" OpenSSH中存在的功能:当用户连接到服务器时,他会收到一条消息,指示上次连接的IP /时间。
要对用户进行身份验证,SSH服务器会像这样使用PublicKeyCallback。
authorizedKeys
var authorizedKeys map[string]*keyHistory
type keyHistory struct {
Origin net.Addr
Time time.Time
}
变量将封送的publick键映射到应该存储Origin ip地址和最后一次连接公钥的时间的类型。
PublicKeyCallback
问题是用于验证用户的公钥唯一可用的地方是terminal.Terminal
执行期间,但在此处注册连接事件不会保证连接过程赢得& #39;以后失败。
我后面的意思是授权公钥后发生的不同步骤:
shell
实现)pty-req
,window-change
,terminal.ReadLine()
)ssh.ServerConn
理想情况下,连接事件ip / time将在运行终端循环之前记录,以确保它对应于成功登录。不幸的是,此时只有终端的基础text-align: "center"
可用,并且无法将其链接回公钥。
任何导致实现类似功能的导致?任何可以达到同样效果的项目的示例或链接都将受到赞赏。
由于