我使用命令行在Python中运行dd命令,但是,每当我尝试实际运行命令时,我得到:
dd:打开'/ dev / sdb':权限被拒绝
我知道我必须做某种根本的事情吗?而且我只需要我的代码的某一部分来运行dd命令,所以我不需要“根”整个事情;但整个“根”概念让我困惑......
非常感谢帮助!!
答案 0 :(得分:1)
我知道我必须做某种根本的事情吗?
确实你这样做了!
如果您使用的是Linux,sudo
是升级用户权限的惯用方法。
所以改为调用'sudo dd if=/dev/sdb of=/dev/null
'(例如)。如果您的脚本必须是非交互式的,请考虑在admin ALL = NOPASSWD: ALL
或类似内容中添加sudoers
之类的内容。
答案 1 :(得分:1)
您可以通过更改磁盘的访问权限来在操作系统级别解决此问题。这可能优于每次运行脚本时使用sudo,因为您不必使用密码或担心脚本会变得疯狂并消除系统。
很抱歉,如果我在这里有点基础,但linux使用文件权限来决定用户如何访问文件系统中的文件。在我的机器上:
$ ls -l /dev/sda2
brw-rw---- 1 root disk 8, 2 Jun 27 15:04 /dev/sda2
设备由“root”(超级用户)拥有,位于“磁盘”组中。 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:
现在,如果我列出设备,我会在权限字符串上看到加号,这意味着我还可以查看扩展的acls
$ 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)。我可以让其他我不信任的人使用这个脚本,给予他们对块设备的权利而不给他们王国的钥匙。