如何使用 python 在不使用 sudo 的情况下在 macOS high Sierra 上访问 USB
how to access usb on macOS high Sierra without sudo using python
我需要访问连接的 USB 设备(视为驱动器)以在 macOS 中读取并最终写入。我可以使用 sudo 做我需要做的事情,但是因为这需要是非技术用户的分布式应用程序,所以命令行是不可能的。
这是失败的最简单的代码。
#!/usr/local/bin/python
usb_drive = '/dev/disk1' #USB bsdname, verified with "system_profiler SPUSBDataType"
with open(usb_drive, 'rb', 512) as disk:
some_bytes = disk.read(512)[4:8]
print(some_bytes)
当不是 运行 作为 sudo 时失败。 macOS High Sierra 10.13.6 供参考
mac:test mac$ ./test.py
Traceback (most recent call last):
File "./test.py", line 3, in <module>
with open(usb_drive, 'rb', 512) as disk:
IOError: [Errno 13] Permission denied: '/dev/disk1'
看来 linux,我可能需要在 udev 中添加一些规则。但我一直在费力地寻找有关 macOS 的信息。我发现有一些点击表明 chmod 4755 之类的东西可能有效,但前提是所有父目录都已正确设置。我发现的其他事情表明在安装包期间可能需要设置一些东西。但是我开始 运行 进入有关此信息的死胡同。
编辑:更多信息。这是我继承的项目,没有任何构建说明或脚本。我有一个适用于以前版本的有效 pkg 安装程序,它允许脚本 运行 没有 sudo,我希望在一天结束时复制该安装程序。
我最终使用 elevate 包作为这个问题的不雅解决方案。
当 运行 应用程序时,它将检查它是否具有 sudo 访问权限,如果没有,它将生成一个子进程,该子进程将请求 sudo 访问权限,弹出一个 window 请求须藤密码。主要的缺点是,我最终在 mac 停靠栏中两次使用相同的应用程序图标,而它是 运行,但这对于这个简短的 运行 应用程序的需求是可以接受的。
https://pypi.org/project/elevate/
import os
from elevate import elevate
def is_root():
return os.getuid() == 0
print("before ", is_root())
elevate()
print("after ", is_root())
我需要访问连接的 USB 设备(视为驱动器)以在 macOS 中读取并最终写入。我可以使用 sudo 做我需要做的事情,但是因为这需要是非技术用户的分布式应用程序,所以命令行是不可能的。
这是失败的最简单的代码。
#!/usr/local/bin/python
usb_drive = '/dev/disk1' #USB bsdname, verified with "system_profiler SPUSBDataType"
with open(usb_drive, 'rb', 512) as disk:
some_bytes = disk.read(512)[4:8]
print(some_bytes)
当不是 运行 作为 sudo 时失败。 macOS High Sierra 10.13.6 供参考
mac:test mac$ ./test.py
Traceback (most recent call last):
File "./test.py", line 3, in <module>
with open(usb_drive, 'rb', 512) as disk:
IOError: [Errno 13] Permission denied: '/dev/disk1'
看来 linux,我可能需要在 udev 中添加一些规则。但我一直在费力地寻找有关 macOS 的信息。我发现有一些点击表明 chmod 4755 之类的东西可能有效,但前提是所有父目录都已正确设置。我发现的其他事情表明在安装包期间可能需要设置一些东西。但是我开始 运行 进入有关此信息的死胡同。
编辑:更多信息。这是我继承的项目,没有任何构建说明或脚本。我有一个适用于以前版本的有效 pkg 安装程序,它允许脚本 运行 没有 sudo,我希望在一天结束时复制该安装程序。
我最终使用 elevate 包作为这个问题的不雅解决方案。
当 运行 应用程序时,它将检查它是否具有 sudo 访问权限,如果没有,它将生成一个子进程,该子进程将请求 sudo 访问权限,弹出一个 window 请求须藤密码。主要的缺点是,我最终在 mac 停靠栏中两次使用相同的应用程序图标,而它是 运行,但这对于这个简短的 运行 应用程序的需求是可以接受的。
https://pypi.org/project/elevate/
import os
from elevate import elevate
def is_root():
return os.getuid() == 0
print("before ", is_root())
elevate()
print("after ", is_root())