错误,即使使用 sudo:“dd:无法打开‘/dev/sda1’:权限被拒绝”(从 gzip 管道传输的 dd 输入)

错误,即使使用 sudo:“dd:无法打开‘/dev/sda1’:权限被拒绝”(从 gzip 管道传输的 dd 输入)

我的命令不起作用

sudo gzip -dc sda1.image.gz | dd of=/dev/sda1

在我输入密码之前就返回了以下错误:

dd: failed to open ‘/dev/sda1’: Permission denied
[sudo] password for ken:

我也尝试过不使用“-dc”选项,但出现了同样的错误。

但是,dd 命令不使用 gzip,使用未压缩的文件,确实有效

sudo dd if=sda1.image of=/dev/sda1

似乎 sudo 仅适用于第一个命令,而不适用于整个命令序列。如果我保持在同一终端会话中并重复该命令,则不会收到密码提示(我的身份验证似乎仍然存在),但我仍然收到相同的错误(好像我的身份验证不适用于 /dev 写入操作)。从 /bin/sh 脚本执行时会出现相同的错误。

我应该如何构建命令来将图像解压缩到设备上?

我在终端窗口中使用 Ubuntu 14.04 LTS。

答案1

sudo你在管道的另一侧丢失了:

sudo gzip -dc sda1.image.gz | sudo dd of=/dev/sda1

<command> | <command> | [...]命令格式中,需要的管道的每个命令都sudo应该使用 来运行sudo,而不仅仅是第一个命令。

在这种情况下,您可能不需要使用sudoon gzip -dc sda1.image.gz,除非您没有该文件的读取权限:

gzip -dc sda1.image.gz | sudo dd of=/dev/sda1

一般来说,如果管道中运行的所有命令都需要sudo,则避免写入sudo每个命令的一种方法是在使用调用的子 shell 中运行整个命令sudo

sudo bash -c '<command> | <command> | [...]'

答案2

几年后发现了这个问题和答案,它帮助我解决了同样的问题。

对于将来的情况,将创建图像所使用的命令与将图像移回另一个分区所需的命令一起保存到文本文件可能会很有用。

例如:

sudo dd if=/dev/mmcblk0 | gzip > YYYYMMDD_Rasp4_Backup.img.gz

移动到新分区:

sudo cat YYYYMMDD_Rasp4_Backup.img.gz | sudo gunzip | sudo dd of=/dev/sdb

将这些命令与 .img.gz 文件一起保存在文本文件中作为提醒。

相关内容