出于安全考虑,公司要求对阿里云上的部分服务器修改root密码,其中服务器中有一台Centos和若干台ubuntu。在我很慎重地更改了密码之后,没想到还是出了问题,有一台服务器ssh登录不上去了。

   当时考虑到有两个可能:

   1.有可能是ssh配置文件没有打开,PermitRootLogin yes(刚刚升级过ssh,这个原因也是可能的)

   2.密码错误

   往回梳理,发现这台服务器是Centos的,并且是用复制粘贴echo "LN3T!854qq" |passwd --stdin root 这条命令来更改的密码,理应不可能出错的。所以怀疑是ssh的问题,通过阿里云终端登录服务器来验证,发现仍然不能登录服务器,所以应该不是ssh的问题。

   回到密码本身,考虑会不会是这条命令出了问题。找到另一台Centos服务器来测试这条命令,问题就出现了,发现这条根本不能执行成功。

wKiom1imbIyQx7ZVAAAQajYsb5Y281.png-wh_50

然而,这里无法执行成功,可是之前明明是执行成功了的,这是矛盾的。把"!"换成"#"再执行一遍命令,密码就更改成功了,所以,问题就是出在了密码中有"!"。继续测试echo命令和"!",知道了"!"在echo中是有不同意义的,如果要输出"!",就需要"\"来转译。

通过echo

   最后,实在没办法,只能通过阿里云终端重置密码,然后获得允许重启了服务器,最终才登录了服务器。通过history命令查看操作历史纪录,看到echo "LN3T!854qq" |passwd --stdin root这条命令确实执行成功了,并且把密码更改了,应该是出现了bug。

wKiom1imb8KBZ0fWAAAHr_PbmjU985.png-wh_50

   问题最终找到了,也解决了。通过这件事,也有一些收获:

   1.设置密码最好不要使用echo "password" |passwd --stdin user 这条命令,一是不安全,通过history可以看到密码,二是不确定因素太多,设置密码容易出错,具体echo的用法可以上网搜索查看;

   2.一台服务器至少应该设置两个用户,一个是root,另外一个是拥有root权限的普通用户(通过配置/etc/sudoers可以实现),这样就能够保证一个密码出错后还可以通过另外一个用户登录服务器重置密码,;

   3.通过passwd user 命令更改密码,密码中出现的符号不包含其他意义,仅仅是作为符号本身来使用,这种方法设置密码更安全。