guestfish
guestfish 常用命令 + 实战示例
guestfish:虚拟机磁盘镜像编辑工具,无需启动虚拟机,直接修改 qcow2/raw 镜像内部文件、权限、脚本、配置。 注意:不要同时多个 guestfish 操作同一个镜像,避免镜像损坏;操作前建议备份镜像。 两种使用方式:交互式、here‑doc(
<<EOF)脚本方式
guestfish 核心常用命令清单
表格
| 命令 | 作用 |
|---|---|
run |
启动虚拟机后端,必须最先执行 |
list-filesystems |
列出镜像内全部文件系统,看分区设备 /dev/sda1 /dev/sda2 |
list-partitions |
列出磁盘分区,看分区大小、设备名 |
mount /dev/sda2 / |
把镜像内分区挂载到 guestfish 虚拟根 / |
umount / |
卸载挂载点 |
upload 宿主机路径 镜像内路径 |
宿主机上传文件进镜像 |
download 镜像内路径 宿主机路径 |
把镜像内文件下载到宿主机 |
ls /etc/ |
列出镜像内目录 |
cat /etc/xxx.conf |
查看镜像内文件内容 |
write /tmp/a.txt "content" |
直接写字符串到镜像内部文件 |
rm /etc/xxx |
删除镜像内文件 |
mkdir -p /etc/post.d |
创建镜像内目录 |
chmod 0755 /xxx |
修改镜像内文件权限 |
chown 0:0 /xxx |
修改镜像内文件属主 root:root |
glob rm /tmp/*.log |
通配符删除文件 |
q / quit |
退出 |
重要:guestfish 内部路径是镜像内部的路径,不是宿主机路径。
高频实战示例(here‑doc 脚本格式,可直接复制运行)
示例 1:查看镜像分区,确认分区名称
guestfish -a topsec.qcow2 <<EOF
run
list-partitions
list-filesystems
q
EOF
示例 2:下载镜像内部文件到宿主机(备份配置)
guestfish -a topsec.qcow2 <<EOF
run
mount /dev/sda2 /
download /etc/post.d/config /root/config_backup
q
EOF
示例 3:直接往镜像写入文本内容,不依赖宿主机文件
guestfish -a topsec.qcow2 <<EOF
run
mount /dev/sda2 /
write /etc/post.d/test.sh "#!/bin/bash\necho hello\n"
chmod 0700 /etc/post.d/test.sh
q
EOF
示例 4:镜像内创建目录 + 上传脚本 + 改属主权限完整流程
guestfish -a topsec.qcow2 <<EOF
run
mount /dev/sda2 /
mkdir -p /etc/post.d/mitigate
upload /root/fix.sh /etc/post.d/mitigate/fix.sh
chmod 0750 /etc/post.d/mitigate/fix.sh
chown 0:0 /etc/post.d/mitigate/fix.sh
ls -l /etc/post.d/mitigate/
q
EOF
示例 5:读取镜像内部文件,打印到宿主机 stdout
guestfish -a topsec.qcow2 <<EOF
run
mount /dev/sda2 /
cat /etc/post.d/vuln9108_mitigate
q
EOF
示例 6:删除镜像内文件
guestfish -a topsec.qcow2 <<EOF
run
mount /dev/sda2 /
rm /etc/post.d/badfile
q
EOF
示例 7:交互式手动操作(不写脚本)
guestfish -a topsec.qcow2
#进入交互shell之后手动输入:
run
list-filesystems
mount /dev/sda2 /
ls /etc/post.d
q
常见坑点 & 排错
mount: no such device- 分区设备名写错,先执行
list-filesystems确认真实设备,不一定是 sda2,可能是/dev/vda2、/dev/sda1。
- 分区设备名写错,先执行
- upload 报错找不到宿主机文件
- upload 第一个参数是宿主机的绝对路径,脚本执行用户要能读到该文件。
- 镜像被占用
- 虚机不要启动,不要 virt-manager 打开该镜像,否则 guestfish 无法独占镜像。
- 忘记 run
- run 必须在 mount、list‑filesystems 之前,否则所有磁盘操作报错。
- 多分区镜像
- 如果
/boot在独立分区,需要多 mount:
mount /dev/sda2 / mount /dev/sda1 /boot - 如果
回滚思路(你偏好的可逆操作)
修改镜像前,建议先备份镜像:
cp topsec.qcow2 topsec.qcow2.bak
如果只是单文件修改,可以先 download 备份镜像内原始文件,出问题再 upload 还原:
#备份原文件
guestfish -a topsec.qcow2 <<EOF
run
mount /dev/sda2 /
download /etc/post.d/vuln9108_mitigate /root/vuln9108_mitigate.bak
q
EOF
#恢复:把备份写回镜像
guestfish -a topsec.qcow2 <<EOF
run
mount /dev/sda2 /
upload /root/vuln9108_mitigate.bak /etc/post.d/vuln9108_mitigate
q
EOF

浙公网安备 33010602011771号