在C++中卸载USB驱动器

5

我正在开发一个针对Linux(Ubuntu)的Qt应用程序,其中使用USB驱动器备份某些内容。应用程序在复制完内容后应该卸载目标驱动器。我有一个udev规则文件,可以使用ENV{mount_options}="relatime,users,umask=0,uid=user,gid=user"在特定位置挂载USB,其中user代表我的用户名。

我尝试使用这个规则但没有成功。

const char* usb = "/mnt/mountpoint/usbdrive";
if (!umount(usb))
{
  qDebug() << "Device unmounted";
}
else
{
  qDebug() << "Can't unmount" << strerror(errno); //this prints Operation not permitted
}

请问有人可以帮我吗?我是否正确使用了umount命令?

提前感谢。

2个回答

11

2
如果您授予您的应用程序CAP_SYS_ADMIN或设置setuid,则必须非常小心地处理mount(和可能的umount),因为mount本身绝对可以用于本地特权升级。请参阅此漏洞利用,它使用已知的根密码覆盖了/etc/passwd的副本。建议使用能力而不是SUID :) - user257111
@m-m,我需要以root身份运行我的应用程序吗?如果是的话,这可能是不可能的。 - ramtheconqueror
@AntonyVennard:不错,我刚刚添加了一篇文章,讨论了安全问题。 - masoud
@ramtheconqueror:阅读CAP_SYS_ADMIN: the new root,它解释了这个问题,我认为你不需要成为_root_就可以拥有这个特权。 - masoud

0

/etc/sudoers文件中添加以下行:

user ALL=NOPASSWD: /bin/umount

其中user是您的用户名。

不要使用umount ...,而是使用sudo -u user umount ...


抱歉,这样做行不通。正如我在问题中提到的那样,我们需要以编程方式完成,即用户无法使用终端。谢谢。 - ramtheconqueror

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接