0. 概述

今天批量修改AWS 上的 Linux ec2 主机的密码,但是由于脚本写得不是很完善,以及在修改过程中手工干预了一些机器,结果导致其中一台机器的密码错乱,登录不上去。

虽然编写脚本对密码进行暴力枚举,但是,试了一中午还是没试出来,所以只能另辟蹊径。根据以往的经验,自然是新开实例,然后重启一台新的机器替上,但是,坑的是在这台机器的服务较多,有好几个,而且每个服务在其他机器上和负载均衡器上都配置的是IP,这就给更换主机带来了麻烦。

最终,为了保证服务的稳定,还是决定修改这台主机的密码。经过google(百度实在是找不到有价值的参考资料)多个案例,终于找到了修改的方法,整个过程较短,可以在 1~2 分钟内搞定。下面就介绍一下修改 ec2 实例密码的方法。

1. 卸载磁盘

磁盘在 aws 上的术语叫做 volume,我们可以简单得理解为我们平时使用的 PC 上的硬盘,可以方便得拆卸和添加。

在 ec2 console 上找到我们的实例:

关闭它:

然后再选中它,选择属性中的 “Description”,在 “Description” 标签页中找到这个实例挂载的 ebs 列表,然后选择 Root
device 这个卷。点击链接。

你会看到弹出一个窗口,点击这个窗口上 vol-xxxxx 的连接:

然后你就会跳到 volumns 列表,但是因为你是点击链接进来的,所以就只会看到一个卷,并且状态为 “in-use”的:

点击红色圈出来的 “Actions”,选择 “Detach Volume”

稍等片刻,你会发现这个卷的状态会改变成 “available” :

至此,我们就见这个卷卸载下来了。

2. 挂载磁盘

我们新建一台主机,只要是 linux ,什么发行版不重要,不过最好还是推荐使用和原来要修改密码的主机保持一致,主机型号可以随意,我一般都是选 “t2.micro”,然后将这个卷挂载到这个新主机上。

例如,我的新主机是:

找到我们刚才卸载下来的卷,选择 “Action” -> “Attach Volume”

然后你会看到一个弹出窗口,记得实例要选择我们新主机的实例,然后卷名按照我的来就可以了

点击 “Attach” 之后你会看到这个卷的状态就变成了 in-use 了。

3. 读取磁盘

此时,磁盘已经挂载到我们的新主机上,我们登录进新主机,然后使用命令:lsblk 你应该会看到有一个卷叫做 /dev/sdf

然后你需要切换到 root 用户执行以下命令

  1. mkdir /mnt/recovery
  2. mount /dev/sdf1 /mnt/recovery
  3. chroot /mnt/recovery
  4. cp /etc/default/passwd /dev/urandom

最后一句 “cp /etc/default/passwd /dev/urandom” 非常有必要,不加上的话里很可能会在后面的修改密码环节遇到以下错误:

  1. # passwd
  2. Changing password for root New password:
  3. Reenter New Password:
  4. Cannot open /dev/urandom for reading: No such file or directory
  5. Cannot create salt for blowfish crypt
  6. Error: Password NOT changed.
  7. passwd: Authentication token manipulation error - See more at:

4. 修改密码

当你完成 步骤3 的时候,修改密码就和在原来主机上修改没什么区别了,直接执行以下命令即可:

  1. (echo root用户的密码;sleep 1; echo root用户的密码)| passwd root

如果是修改其他用户的密码,只需要替换上面的密码和最后的 “root”,例如修改 Tyrael 用户的,那么命令是:

  1. (echo password;sleep 1; echo password)| passwd Tyrael

执行完之后,用户密码已修改完成,此时按 Ctrl + D 退出 chroot

5. 从主机上卸载磁盘

修改完密码之后,并且确保按过一次Ctrl + D 之后, 只能按一次!!!执行以下命令:

  1. cd /home
  2. umount /mnt/recovery

6. 恢复主机

按照步骤 1 和 2 的操作,将磁盘从新主机上卸载下来,然后挂载到旧主机上,然后启动旧主机。你会发现,可以用刚才修改的密码登录了。