我正面临一个问题。我的要求是,我需要以普通用户身份挂载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
据我所知,它应该有用。
你能指出我的代码有什么问题吗?
实现这一目标的其他任何方式?
答案 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)
您的方法在实践中是非常错误的:使用sudo
或super
(或直接调用mount(2)系统调用,这对于NFS安装来说很棘手。)
您应该使用setreuid(2)
在root
之前更改(到execlp
,即0)真实和有效的uid
请注意,可执行文件上的 setuid 标志使您的程序能够setreuid
(或调用setuid
),但不会自动执行此操作(因为您的程序可以做一些事情 - 就像普通用户之前调用setreuid
一样,例如打开一些配置文件,让普通用户可以运行你的命令读取)
另请参阅Advanced Linux Programming,execve(2),capabilities(7),credentials(7)