提升权限以在Linux上打开sqlite3根数据库- C编程

py49o6xq  于 2023-05-16  发布在  Linux
关注(0)|答案(1)|浏览(118)

我正在创建一个Linux软件,它将有两种类型的数据库:

  1. Public:存储my_program_group上的任何人都可以访问的信息(没有root权限);
  2. Private:只有拥有sudo访问权限的用户才能打开(my_program_group上的普通用户不能)。这也意味着数据库文件归root所有。
    第一种数据库工作正常。
    问题是:我的程序不需要用sudo运行;因此,如果某个普通用户需要打开一个私有数据库,他将需要访问root权限(提升权限)。我不想用sudo重新启动执行,而只是请求密码。
#include <sqlite3.h>
#include <stdio.h>

// Private database path
#define PATH = "/tmp/test/database.db"

void private_db(sqlite3 **db);

int main() {
    sqlite3 *db;
    
    // When the user needs to open the private database, this function will be called:
    private_db(&db);
    
    // Continue...

    return 0;
}

void private_db(sqlite3 **db){
    int rc;

    // NEED TO RUN THIS AS ROOT:
    rc = sqlite3_open(PATH, db);
    if(rc  != SQLITE_OK) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg( &(**db) ));
        exit (1);
    } else {
        printf("Database successfully openend\n");
    }
}

(As预期)如果我运行上面的代码,sqlite将无法打开数据库,因为系统权限。

anauzrmj

anauzrmj1#

我为你修改了一个新密码。希望能有所帮助。
创建一个名为db_helper. c的新文件,并添加以下代码:

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define PATH "/tmp/test/database.db"

int main() {
    int fd = open(PATH, O_RDWR);
    if (fd < 0) {
        perror("Can't open database");
        return 1;
    }
    printf("Database successfully opened\n");
    printf("Database file descriptor: %d\n", fd);

    // Pass the opened file descriptor to the parent process
    // Here, we use file descriptor number 3 for passing to the parent
    dup2(fd, 3);
    close(fd);

    return 0;
}

编译db_helper. c文件,将所有者更改为root,并设置setuid位:

gcc -o db_helper db_helper.c
sudo chown root:root db_helper
sudo chmod 4750 db_helper

更新您的主程序以使用帮助程序打开私有

database:
#include <sqlite3.h>
#include <stdio.h>
#include <unistd.h>

// Private database path
#define PATH "/tmp/test/database.db"
#define HELPER_PROGRAM "./db_helper"

void private_db(sqlite3 **db);

int main() {
    sqlite3 *db;

    // When the user needs to open the private database, this function will be called:
    private_db(&db);

    // Continue...

    return 0;
}

void private_db(sqlite3 **db){
    int rc;
    int fd;

    pid_t pid = fork();
    if (pid == 0) {
        // Child process
        execl(HELPER_PROGRAM, HELPER_PROGRAM, NULL);
        perror("execl");
        exit(1);
    } else if (pid > 0) {
        // Parent process
        wait(NULL);
    } else {
        perror("fork");
        exit(1);
    }

    // Read the file descriptor from the helper program (number 3)
    fd = 3;

    // Open the SQLite database using the received file descriptor
    rc = sqlite3_open_v2("db_alias", db, SQLITE_OPEN_READWRITE, NULL);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(*db));
        exit(1);
    } else {
        printf("Database successfully opened\n");
    }
}

并编译它:

gcc -o main main.c -lsqlite3
./main

相关问题