簡體   English   中英

如何使用C程序在沒有root訪問權限的情況下掛載文件系統?

[英]How to mount file system without root access using C program?

我面臨一個問題。 我的要求是,我需要以普通用戶身份掛載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

據我所知,它應該工作。

您能指出我的代碼有什么問題嗎?

還有其他方法可以做到這一點嗎?

正如user1641854所說,您可以使用sudo 如果您不想這樣做,也可以將預期的安裝點添加到/etc/fstab並確保其設置了user標志以允許非root用戶安裝它

就像是:

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

盡管您可能還需要其他標志。

SuDo是專門為此目的而設計的-允許非特權用戶運行特權命令(以委派權限)。 為了解決您的問題,您必須添加setuid(0); ,然后嘗試執行execlp(3)

您的方法在實踐中是完全錯誤的:使用sudosuper (或直接調用mount(2) syscall,這對於NFS掛載是棘手的)。

您應該使用setreuid(2)更改 execlp之前的真實和有效uid(以root ,即0 )。

請注意,可執行文件上的setuid標志使您的程序可以setreuid (或調用setuid ),但不會自動執行該操作(因為您的程序可以像調用普通用戶一樣做一些事情- 調用setreuid 之前 ,例如,打開某些配置)文件,供運行命令的普通用戶讀取)

另請參見高級Linux編程execve(2)功能(7)憑據(7)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM