有时从网上下载的虚拟机镜像。没有rootpassword,必须通过秘钥登录。然后秘钥又须要麻烦的注入到里面去。想用,却无法登录。非常头痛。本文提供一种通过改动虚拟机镜像里面的/etc/shadow文件,来设置镜像的rootpassword,当然也能够改动其他用户的password。

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

sudo apt-get install python-guestfs 

centos系统请运行:

sudo yum install python-libguestfs 

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

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将生成后的加密password放到虚拟机镜像里面的/etc/shadow文件里:

image_file = "ubuntu.qcow2"
image_format = "qcow2"
password = "123456"
shadow_path = "/etc/shadow" #调用encrypt_passwd()使用md5算法对password进行加密,并返回加密后的password
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相应的行的password设为加密password                                            
  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()

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

运行:

sudo bash changerootpasswd.sh ubuntu.qcow2 123456

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

參考文献

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

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

改动虚拟机镜像的rootpassword的更多相关文章

  1. Jexus Web Server 完全傻瓜化图文配置教程(基于Ubuntu 12.04.3 64位)[内含Hyper-v 2012虚拟机镜像下载地址]

    1. 前言 近日有感许多新朋友想尝试使用Jexus,不过绝大多数都困惑徘徊在Linux如何安装啊,如何编译Mono啊,如何配置Jexus啊...等等基础问题,于是昨日向宇内流云兄提议,不如搞几个配置好 ...

  2. 世纪互联运营的Microsoft Azure正式支持FreeBSD虚拟机镜像

    自2012年开始,微软云计算与企业事业部和Citrix思杰,NetApp达成合作,共同开发出第一版针对Hyper-V虚拟设备驱动以及相关的用户态程序,并将此称之为集成服务(Integration Se ...

  3. 在 Windows Azure 上部署并定制化 FreeBSD 虚拟机镜像

     发布于 2014-12-11 作者 陈阳 FreeBSD 基础镜像现已登陆中国的 VM Depot! 对于青睐 BSD 而非 Linux 的开源爱好者来说,这无疑是个好消息.同时,随着该基础镜像 ...

  4. 教程:在 VM Depot 中查找 Azure 可用的虚拟机镜像

     发布于 2014-07-08 作者 陈 忠岳 对于 Azure 的社区管理虚拟机资源库--VM Depot--的用户来说,网站的搜索功能已得到极大的改善.这一搜索能力的增强,可以帮助用户更容易地 ...

  5. 虚拟机镜像压缩(qcow2,raw)

    ●qcow2 格式的压缩首先,需要对虚拟机系统的剩余空间写零操作: $ dd if=/dev/zero of=/zero.dat 删除 zero.dat$ rm /zero.dat关闭虚拟机,进入虚拟 ...

  6. 修改kvm虚拟机镜像大小

    修改虚拟机镜像大小(qcow2/raw resize) 创建一个镜像文件,大小1G taw muxueqz@muxueqz /tmp $ qemu-img create -f raw t.raw 1G ...

  7. 宿主机mount虚拟机镜像文件

    转载 mount挂载虚拟机镜像文件 使用mount挂载ubuntu虚拟机所在的img文件的时候,执行: “sudo mount -o loop xxx.img /mnt/xxx”, 系统提示: “mo ...

  8. Windows环境下在Oracle VM VirtualBOX下克隆虚拟机镜像(克隆和导入)

    Windows环境下在Oracle VM VirtualBOX下克隆虚拟机镜像: 注:直接复制一个.vdi 虚拟硬盘再挂上去就可以,但Virtualbox居然提示UUID重复,无法使用. 则,可以通过 ...

  9. nova虚拟机镜像从创建到文件系统resize完整流程

    1. 虚拟机镜像的创建和resize流程 nova创建虚拟机涉及的组件比较多,调用比较复杂,这里只列出跟虚拟机镜像创建相关的流程,方便理清虚拟机状态变化的整个流程. nova-api nova.api ...

随机推荐

  1. MVC系列学习(十四)-路由规则及路由调试工具

    1.本次学习的代码,比较简单,就是在路由配置文件中,添加一个路由信息:同时添加一个相应的控制器及视图 控制器中代码如下 即有两条路由匹配规则,一个Kim控制器,该控制器下有个Index的方法,和一个对 ...

  2. Struts2 之 实现文件上传(多文件)和下载

    Struts2  之 实现文件上传和下载 必须要引入的jar commons-fileupload-1.3.1.jar commons-io-2.2.jar 01.文件上传需要分别在struts.xm ...

  3. python基础篇(一)-------- 字符串的操作

    1.字符串的常用操作: 已知字符串:str = "hello world zhangsan and zhangsan" 1.字符串的长度:len(str) 2.查看字符串的索引值: ...

  4. fcc html5 css 练习3

    行内样式看起来是这样的 <h1 style="color: green"> .pink-text { color: pink !important; }         ...

  5. 使用jquery animate实现锚点慢慢平滑滚动效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. html5——3D案例(立方体)

    立方体:父盒子规定了3d呈现属性,立方体做旋转运动 移动顺序:1.每个盒子都先移动100px,然后再做相应的旋转  2.只有这样立方体的几何中心点与父盒子的几何中心点是一样的 <!DOCTYPE ...

  7. CSS——属性选择器

    属性选择器:通过对标签中属性的选择,控制标签. <!DOCTYPE html> <html> <head> <style> div[class*=&qu ...

  8. 【技术累积】【点】【java】【21】序列化二三事

    基础概念 把对象等转为二进制进行传输的是序列化,反之为反序列化: 应用场景一般为读写文件,传输数据/接口调用: Externalizable和Serializable java的序列化方式有两种: S ...

  9. Centos6.7 安装zabbix+apache+mysql教程(第一篇)

    Centos6.7 安装zabbix+apache+mysql教程 blog地址: http://www.cnblogs.com/caoguo ### 基本包安装 ### [root@ca0gu0 ~ ...

  10. dos命令在vba中应用

    正常情况下想要遍历文件夹和子文件夹,可以采用递归的方式 Sub ListFilesTest() With Application.FileDialog(msoFileDialogFolderPicke ...