【问题标题】:How to mount file system without root access using C program?如何使用 C 程序挂载没有 root 访问权限的文件系统?
【发布时间】:2015-08-19 01:25:07
【问题描述】:

我面临一个问题。我的要求是,我需要以普通用户身份挂载NFS 目录。我不想使用root。为此,我开发了以下简单的程序来实现这一点。但是,它没有按预期工作。

我的程序:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

void usage( char *progName ) {
        printf("Usage : %s {mount|umount}\n",progName);
}

int main( char argc , char *argv[] )
{
        if ( argc != 2 ) {
                usage( argv[0] );
                return EXIT_FAILURE;
        }

        if ( strcmp(argv[1] , "mount") == 0 ) {
                execlp("mount", "mount", "192.168.12.3:/home/share", "/home/share", NULL);
        }
        else if( strcmp(argv[1] , "umount" ) == 0 ) {
                execlp("umount", "umount", "/home/share", NULL);
        }
        else {
                usage( argv[0] );
                return EXIT_FAILURE;
        }

        return EXIT_SUCCESS;
}

那么,

$ cc mount_share.c -o Mount

我还为可执行文件设置了set user id

$ chmod u+s Mount
$ ls -lhrt Mount
-rwsr-xr-x  1 root    root    8.3K Jun  4 17:47 Mount

然后我以普通用户的身份执行Mount,但它仍然显示错误。也就是说,

mount: only root can do that

据我所知,它应该可以工作。

你能指出我的代码有什么问题吗?

还有其他方法可以实现吗?

【问题讨论】:

  • 你不能那样做。您可能会阅读更多关于 setuid 的信息 - 小心,错误可能会打开巨大的安全漏洞!- 您应该使用像 sudosuper 这样的命令(并且您可以仔细配置它们以避免询问某些 的任何密码选定的命令)
  • @BasileStarynkevitch,我正在寻找类似passwd 命令如何工作的解决方案。
  • 我投了反对票,因为这是一个相当普遍的问题(并且可能已经以不同的形式在这里被问过很多次)。另外,因为您没有解释为什么要这样做(为什么不使用sudo,为什么要分叉mount 命令而不使用mount(2) 系统调用等...)。这个问题有很多答案,问得不好,动力不够。

标签: c unix exec mount


【解决方案1】:

正如用户 1641854 所说,您可以使用 sudo。如果您不想这样做,您还可以将预期的挂载点添加到 /etc/fstab 并确保它设置了 user 标志以允许非 root 用户挂载它

类似:

192.168.12.3:/home/share /home/share nfs user

虽然您可能还需要其他标志。

【讨论】:

    【解决方案2】:

    SuDo 专门为此目的而设计 - 允许非特权用户运行特权命令(委派权限)。 为了解决您的问题,您必须先添加setuid(0);,然后再尝试execlp(3)

    【讨论】:

    • 谢谢..但是,我不想使用sudo。我想利用我的知识(setuid+exec+other) 来实现这一目标。
    • +1,谢谢。你解决了我的问题。但是,我想知道chmod u+s Mountsetuid(0)在程序内部调用的区别。
    • @Kalanidhi 尝试阅读 POSIX 文档 - pubs.opengroup.org/onlinepubs/9699919799/functions/setuid.html,基本原理部分。
    【解决方案3】:

    您的方法在实践中非常错误:使用sudosuper(或直接调用mount(2) 系统调用,这对于NFS 挂载来说很棘手)。

    你应该在execlp之前更改(到root,即0)真实和有效的uid,使用setreuid(2)

    请注意,可执行文件上的 setuid 标志使您的程序能够setreuid(或调用setuid),但不会自动执行此操作(因为您的程序可以执行一些操作-作为普通用户-之前调用setreuid,例如打开一些配置文件,让普通用户可以读取运行你的命令)

    另请参阅Advanced Linux Programmingexecve(2)capabilities(7)credentials(7)

    【讨论】:

      猜你喜欢
      • 2012-08-12
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2013-11-01
      • 2012-05-04
      • 2011-10-29
      相关资源
      最近更新 更多