SSH服务器上次登录消息实现

时间:2017-05-22 19:25:23

标签: go ssh server

我使用&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;以后失败。

我后面的意思是授权公钥后发生的不同步骤:

  • 拒绝所有非会话频道
  • 接受会话频道
  • 使用会话通道和conn创建一个新终端(使用自己包装的shell实现)
  • 处理其他请求(pty-reqwindow-changeterminal.ReadLine()
  • 运行循环以使用ssh.ServerConn
  • 读取终端的输入

理想情况下,连接事件ip / time将在运行终端循环之前记录,以确保它对应于成功登录。不幸的是,此时只有终端的基础text-align: "center"可用,并且无法将其链接回公钥。

任何导致实现类似功能的导致?任何可以达到同样效果的项目的示例或链接都将受到赞赏。

由于

0 个答案:

没有答案