Bootstrap

linux ssh密码过期时间,go语言ssh客户端解决密码过期问题

go语言的ssh包居然不支持密码过期重置的功能!

版本:go v1.14.1 linux环境下安装的。

ssh包:git clone https://github.com/golang/crypto.git

是2020年4月1号左右下载的。

先描述一下问题的现象,以及必须得解决这个问题的原因:

正常的ssh客户端,如果密码过期了,或者不符合密码规则,在登陆的时候终端都会提示一段话,比如过期之类的。然后会提示你在终端输入旧密码,再输入新密码,然后确认,从而完成密码修改。

然而用这个ssh包,执行ssh.Dial的时候,如果遇到密码过期,这个函数会直接返回一个错误,并不会给你修改新密码的机会!

而我的项目恰恰需要这个功能。因为我的项目是服务器通过ssh客户端推送脚本到一个设备,其中就有修改密码的脚本,目的就是想修改目标设备的密码。如果该设备的密码没有过期,我还可以通过旧密码登陆上,然后执行修改密码的脚本。但是如果密码过期,则在ssh登陆的时候就会提示修改密码,如果像go语言这样直接返回失败,我就没法修改成功密码了。而其他语言或者终端软件,都有重置密码这个功能。我认为这可能是go语言太年轻了,没有完善这个功能的原因吧(至少我没有找到)。

再说一下解决的方法和原理:

我是自己修改了ssh包中的client_auth.c文件解决的。

具体的修改是方法是增加了一个自定义的认证方式changePassword,来代替后面要讲的“password”认证,并实现规定的auth方法和method方法。这两个方法是ssh包里规定必须要实现的,只有实现了这两个方法,才算是实现了AuthMethod接口,才能作为ssh client的一种配置去连接ssh服务器。其实我也可以直接修改“password”的代码,但是由于不太敢动,所以重新写了一个,它的还保留着。~~~~

接口定义在client_auth.go中:

type AuthMethod interface {

auth(session []byte, user string, p packetConn, rand io.Reader) (authResult, []string, error)

method() string

}

ssh包中之前就定义好了几种认证方式,包括:

“none”

;