修改虚拟机镜像的root密码

有时从网上下载的虚拟机镜像,没有root密码,必须通过秘钥登录,然后秘钥又需要麻烦的注入到里面去。想用,却无法登录,很头痛。本文提供一种通过修改虚拟机镜像里面的/etc/shadow文件,来设置镜像的root密码,当然也可以修改其它用户的密码。

本文使用python-guestfs类库来操作虚拟机镜像,所以请安装python-guestfs及相关包。ubuntu系统执行:

sudo apt-get install python-guestfs 

centos系统请执行:

sudo yum install python-libguestfs 

给指定密码生成加密过后的密码:

def encrypt_passwd(admin_passwd):
    algos = {'SHA-512': '$6$', 'SHA-256': '$5$', 'MD5': '$1$', 'DES': ''}
    salt_set = ('abcdefghijklmnopqrstuvwxyz'
                'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                '0123456789./')
    salt = 16 * ' '
    salt = ''.join([random.choice(salt_set) for c in salt]) 

    encrypted_passwd = crypt.crypt(admin_passwd, algos['MD5'] + salt)
    if len(encrypted_passwd) == 13:
        encrypted_passwd = crypt.crypt(admin_passwd, algos['DES'] + salt)          

    return encrypted_passwd

使用guestfs将生成后的加密密码放到虚拟机镜像里面的/etc/shadow文件中:

image_file = "ubuntu.qcow2"
image_format = "qcow2"
password = "123456"
shadow_path = "/etc/shadow"

#调用encrypt_passwd()使用md5算法对密码进行加密,并返回加密后的密码
encrypted_passwd = encrypt_passwd(password)
#初始化一个GuestFS实例,用于后面对虚拟机镜像的操作
handle = guestfs.GuestFS(python_return_dict=False, close_on_exit=False)
#将虚拟机镜像文件及格式添加到handle中,用于后面操作
handle.add_drive_opts(image_file, format=image_format)
handle.launch()
#遍历虚拟机镜像中的系统分区,并返回。一般为[/dev/sda1]或[/dev/sda],使用该方法的一个好处是,你可以不指定甚至不用指定系统分区,guestfs就把活给干了
roots = handle.inspect_os()
#遍历系统分区中的挂载点,返回值一般为[['/','/etc/sda1']]
mounts = handle.inspect_get_mountpoints(root)
mounts.sort(key=lambda mount: mount[0])                                         

for mount in mounts:
    #挂载系统分区,将‘/etc/sda1’挂载到‘/’,然后就可以通过handle访问sda1上的文件了
    handle.mount_options("", mount[1], mount[0])

#读取‘/etc/shadow'文件内容
shadow_data = handle.read_file(shadow_path)                           

s_file = shadow_data.split("\n")                                            
                                                                                
new_s_file = []                                                             
for entry in s_file:                                                        
split_entry = entry.split(":")                                          
if split_entry[0] == "root":
    #将root对应的行的密码设为加密密码                                            
    split_entry[1] = encrypted_passwd(password)                         
                                                                             
    new_s_file.append(':'.join(split_entry))                                
                                                                                
new_shadow_data = '\n'.join(new_s_file)
#写入修改过后的‘/etc/shadow’文件
handle.write(path, new_shadow_data)
handle.shutdown()
handle.close()

写了两个脚本,可用于修改虚拟机镜像文件的密码,使用较为方便,如有需要,请查看https://github.com/xuriwuyun/change-root-passwd。执行:

sudo bash changerootpasswd.sh ubuntu.qcow2 123456

即可将ubuntu.qcow2镜像的root登录密码设定为123456.该脚本可支持多种镜像格式,经过验证的有raw\qcow2。

参考文献

1 http://libguestfs.org/guestfs-python.3.html

2 http://libguestfs.org/guestfs.3.html

时间: 2025-02-01 04:54:38

修改虚拟机镜像的root密码的相关文章

使用MobileTerminal修改越狱后的root密码

越狱后,你的IOS设备就拥有了完全的权限,你可以任意安装任意的软件,但是也存在一定的风险,因为默认的root密码使用同一种越狱工具后是一样的,在互联网病毒肆虐的今天,这种弱口令是很不安全的.下面,我们就要介绍修改iPhone默认的root密码. 一.为什么要修改root密码 因为以后要安装很多的管理软件,但是root密码是众所都知的,如果不修改,别人也会拥有管理你的系统的权限,这样当你的设备在网络中时就造成你的设备很容易被入侵,或者在不安全陌生的环境中会感染蠕虫病毒(例如3G环境),所以,为了以

虚拟机Linux的root密码如何重置

前段时间我在虚拟机安装了cent OS7,但是忘记了root密码,登录的时候发现登录不上了,然后重置密码 1.登录失败的页面 2.重启虚拟机,在重启的时候不停的连续按着ESC键 3.进入到该页面之后,选中第一个(高亮显示即为选中)选项,然后按下键盘的"E"键 4.进入到初始化脚本编辑页面,该脚本有两页,用下键向下拉,直到最后两行 5.光标拉到最后两行需要加入一些文字 后面加入下面这一行文字 LANG=\zh_CN.UTF-8(我安装的是中文版的,也有可能你的是\en_US.utf-8)

在忘记root密码的情况下如何修改linux系统的root密码

1.系统启动时长按shift键后可以看到如下界面: 2.找到 recovery mode 那一行, 按下[e]键进入命令编辑状态,到 linux /boot/vmlinuz-....... ro recovery nomodeset 所在行,将 “ro recovery nomodeset”替换为“quiet splash rw init=/bin/bash”,按[Ctrl+x]重启系统. 3.进入bash并用passwd方式修改密码(以root身份启动了一个bash),修改完后按下[Ctrl+

Ubuntu18.04 修改Mysql5.7默认root密码

步骤 设置mysql免密码登陆 编辑/etc/mysql/my.cnf文件,在最后加入以下设置 [mysqld] skip-grant-tables=1 重启mysql $ sudo service mysql stop $ sudo service mysql strat 进入mysql,先修改验证方式,再改密码 $ mysql //修改验证方式 mysql> USE mysql; mysql> UPDATE user SET plugin='mysql_native_password' W

虚拟机CentOS忘记root密码,重置它,来来来

第一不,启动电源到这步. 第二步:如图添加init=/bin/sh   当一行放不下加\后下一行写. 第三步:ctrl+x  引导启动 第四步:添加挂载目录 执行命令    mount -o remount, rw / 第五步:选择需要修改密码的用户,此处选root 执行命令    passwd root 第六步:两次输入新密码(两次密码一致),自己要记住了哈 如果输入密码太简单,会报错,不管他,没事的. 第六步:如果已经开启SElinux,则执行 touch /.autorelabel 最后:

使用SQLyog修改MySQL中的Root密码

事先声明:本人所用的MySQL是绿色解压版的,解压完成便可以直接使用 1.使用SQLyog连接上MySQL 2.查找mysql中的user表 3.打开user表,本人已经设置好了密码,所以显示有密码 4.使用SQL语句修改密码 update user set password = password('123') where host = 'localhost' and user = 'root' 5.重启MySQL服务,再连接即可修改成功 原文地址:https://www.cnblogs.com

linux下修改MySQL root密码后数据库消失

Linux系统下如果没有通过password()函数修改mysql的root密码就会导致mysql数据库消失.有些人可能不知道而直接修改了mysql的root密码,于是产生了mysql数据库消失的问题,这个时候该怎么处理呢? 可以用下面的办法解决: 1.修改mysql数据库目录配置文件:my.cnf(或my.ini) [mysqld]下添加: skip-grant-tables 2.重启mysql服务,然后用mysql 登录. 3.进入后,可以看到,mysql数据库已呈现,然后修改密码: upd

mysql数据库修改root密码方法

Window下修改mysql超级管理员root密码的方法 1停止服务 开始->运行->输入cmd,打开命令提示符窗口,然后输入  net stop mysql  ,停止mysql相关服务 2在命令提示符窗口进去mysql安装目录的bin目录 若是其他盘,请先切换到其他盘 例如 输入 D: 回车即可:然后输入cd 文件路径 例如 cd D:\wamp\bin\mysql\mysql5.5.20\bin 即可进入该文件夹下 3进入mysql安全模式(这样就不需要输入密码就可以进入mysql数据库了

利用phpmyadmin修改mysql的root密码及如何进入修改密码后的phpmyadmin

1.利用phpmyadmin修改mysql的root密码 很多人利用phpmyadmin或者命令行来修改了mysql的root密码,重启后发现mysql登录错误,这是为什么呢?修改mysql的root的密码要在mysql软件中mysql数据库里修改root的密码,还要在配置文件中修改.而且在数据库中的修改不止修改一行数据,所以千万不要手动修改,要用命令来修改. 首先用root账号登陆phpmyadmin,然后点击左侧进入mysql数据库,在顶部点击"mysql"进入sql输入界面.输入