我使用命令行在 Python 中运行 dd 命令,但是,每当我尝试实际运行该命令时,都会得到:
dd:打开“/dev/sdb”:权限被拒绝
我知道我必须做一些根的事情?而且我只需要我的代码的某个部分来运行 dd 命令,所以我不需要“root”整个事情;但整个“根”概念让我感到困惑......
帮助将不胜感激!
我使用命令行在 Python 中运行 dd 命令,但是,每当我尝试实际运行该命令时,都会得到:
dd:打开“/dev/sdb”:权限被拒绝
我知道我必须做一些根的事情?而且我只需要我的代码的某个部分来运行 dd 命令,所以我不需要“root”整个事情;但整个“根”概念让我感到困惑......
帮助将不胜感激!
我知道我必须做一些根的事情?
的确如此!
如果您使用的是 linux,sudo
这是提升用户权限的惯用方式。
所以改为调用' sudo dd if=/dev/sdb of=/dev/null
'(例如)。如果您的脚本必须是非交互式的,请考虑添加类似于admin ALL = NOPASSWD: ALL
your 的内容sudoers
,或类似的内容。
您可以通过更改对磁盘的访问权限在操作系统级别解决此问题。这可能比每次运行脚本时都使用 sudo 更好,因为您不必乱用密码或担心您的脚本会发疯并摧毁您的系统。
对不起,如果我在这里有点基本,但是 linux 使用文件权限来决定用户如何访问文件系统中的文件。在我的机器上:
$ ls -l /dev/sda2
brw-rw---- 1 root disk 8, 2 Jun 27 15:04 /dev/sda2
该设备归“root”(超级用户)所有,位于“disk”组中。root 和磁盘组中的任何人都可以访问该设备。但是“其他人”(其他所有人)被阻止了。
$ dd if=/dev/sda2 of=/dev/null bs=1
dd: opening `/dev/sda2': Permission denied
我不是 root 并且我不在磁盘组中,所以 dd 失败。我可以将自己添加到“磁盘”组中,但这会授予很多权利并冒着邪恶发生的风险。
到目前为止,我们看到的是标准的 *nix 权限,但大多数现代 linux 文件系统都支持扩展权限。我可以授予自己阅读设备的权利
$ sudo setfacl -m u:td:r /dev/sda2
[sudo] password for td:
现在,如果我列出设备,我会在权限字符串上看到一个加号,这意味着我还可以查看扩展的 acl
$ ls -l /dev/sda2
brw-rw----+ 1 root disk 8, 2 Jun 27 15:04 /dev/sda2
$ getfacl /dev/sda2
getfacl: Removing leading '/' from absolute path names
# file: dev/sda2
# owner: root
# group: disk
user::rw-
user:td:r--
group::rw-
mask::rw-
other::---
并且 dd 有效!
$ dd if=/dev/sda2 of=/dev/null bs=1
1024+0 records in
1024+0 records out
1024 bytes (1.0 kB) copied, 0.0146606 s, 69.8 kB/s
请注意,这比 sudo(脚本可以做任何事情)安全得多(脚本可以读取 /dev/sda2)。我可以让其他我不太信任的人使用这个脚本,方法是授予他们对块设备的权利,而不给他们王国的钥匙。