如何使用C程序挂载没有root访问权限的文件系统?

时间:2015-06-04 12:23:20

标签: c unix exec mount

我正面临一个问题。我的要求是,我需要以普通用户身份挂载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

据我所知,它应该有用。

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

实现这一目标的其他任何方式?

3 个答案:

答案 0 :(得分:3)

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

类似的东西:

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

虽然你也可能想要其他旗帜。

答案 1 :(得分:2)

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

之前添加execlp(3)

答案 2 :(得分:2)

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

您应该使用setreuid(2)

root之前更改(到execlp,即0)真实和有效的uid

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

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