【问题标题】:calling mount() system call as a non-root user以非 root 用户身份调用 mount() 系统调用
【发布时间】:2018-02-02 02:21:21
【问题描述】:

我正在编写一个 C/C++ 程序,它需要能够以普通用户身份挂载磁盘(不能使用sudo 运行)。通常,此类问题与在 shell 中使用 mount 命令有关,答案是使用与相关磁盘对应的 /etc/fstab 条目中的“用户”选项。但是,我认为在程序中使用 mount 系统调用时,/etc/fstab 中的列表根本不重要。

但是,由于很明显mount 命令能够允许非root 用户挂载磁盘(假设/etc/fstab 设置正确),并且推测该挂载命令调用mount 系统调用,那我觉得应该可以实现我想要的。

如何在不使用sudo 运行程序的情况下成功调用mount() 系统调用?

【问题讨论】:

  • mount 之所以能做到,是因为mount 是一个setuid 根程序。您的“C/C++ 程序”必须以 root 权限执行。从技术上讲,作为 Linux man pages specifies,需要 CAP_SYS_ADMIN 权限。普通用户进程无法挂载文件系统。
  • 没有C/C++语言,有C就有C++。
  • 但是因为mount是一个setuid根程序,你可以直接运行,不用 sudo,只要/etc/fstab设置正确,就可以了你想要什么。
  • @Pablo 虽然有很多 C/C++ 程序,但使用的就是这个短语。

标签: c++ c linux permissions mount


【解决方案1】:

解决这个困境的一个有效方法是将mount/umount 调用打包到一个shell 脚本中,为应用程序用户提供sudo 权限,然后从应用程序e 调用它。 G。使用system()。确保脚本进行了充分的错误处理,可能还进行了日志记录,在错误或成功时返回适当的退出代码,您可以在调用应用程序中处理。

/etc/sudoers.d/myApplication:

<appUser> <host> = (root) NOPASSWD: /usr/local/bin/myMountScript.sh

在您的应用程序中:

const int result = system("sudo /usr/local/bin/myMountScript.sh <options>");
//Error handling on result follows below

另一种可能性是使用上面评论中提到的功能,并将它们设置在二进制文件中,但这有点复杂,所以我在这里不做详细说明。

【讨论】:

  • 一个有效的解决方案是将mount/umount调用打包到一个shell脚本中,为应用程序用户提供sudo权限,然后从应用程序调用它e. G。使用 system()。 这是一个危险-to-the-security-of your-system 解决方案。例如,您的system("sudo /usr/local/bin/myMountScript.sh &lt;options&gt;"); 将运行由用户的 PATH envval 指定为rootsudo 可执行文件。
  • 这正是任何sudo 调用所做的。您究竟在哪里看到问题?
  • 突然想到:即时 root shell:mkdir ~/bin; ln -s /bin/bash ~/bin/sudo; PATH=~/bin /path/to/yourBinary 除非您非常仔细地配置,否则在任何特权程序中使用 system() 都是极其危险的。你最好打电话给the mount() function directly。无论如何,您几乎都必须对其进行硬编码。
  • system() 调用中硬编码/usr/bin/sudo 怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 2017-07-08
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
相关资源
最近更新 更多