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

常见坑点 & 排错

  1. mount: no such device
    • 分区设备名写错,先执行list-filesystems确认真实设备,不一定是 sda2,可能是/dev/vda2/dev/sda1
  2. upload 报错找不到宿主机文件
    • upload 第一个参数是宿主机的绝对路径,脚本执行用户要能读到该文件。
  3. 镜像被占用
    • 虚机不要启动,不要 virt-manager 打开该镜像,否则 guestfish 无法独占镜像。
  4. 忘记 run
    • run 必须在 mount、list‑filesystems 之前,否则所有磁盘操作报错。
  5. 多分区镜像
    • 如果 /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
posted @ 2026-08-28 10:32  你说夕阳很美  阅读(13)  评论(0)    收藏  举报