![루트가 아닌 사용자가 LUKS 볼륨을 마운트하도록 허용하려면 어떻게 해야 합니까?](https://linux55.com/image/184920/%EB%A3%A8%ED%8A%B8%EA%B0%80%20%EC%95%84%EB%8B%8C%20%EC%82%AC%EC%9A%A9%EC%9E%90%EA%B0%80%20LUKS%20%EB%B3%BC%EB%A5%A8%EC%9D%84%20%EB%A7%88%EC%9A%B4%ED%8A%B8%ED%95%98%EB%8F%84%EB%A1%9D%20%ED%97%88%EC%9A%A9%ED%95%98%EB%A0%A4%EB%A9%B4%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%95%B4%EC%95%BC%20%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
그래픽 파일 관리자에서 LUKS 볼륨을 클릭할 때 먼저 암호화 비밀번호를 입력한 다음 사용자 비밀번호를 입력해야 설치가 완료되었습니다. 창 관리자에서 LUKS 볼륨을 한 번만 마운트하도록 허용하는 방법(아니요부팅 시) 권한을 루트로 올리지 않고? 즉, 로그인 비밀번호를 입력할 필요가 없습니다.
답변1
도우미 프로그램을 사용해 볼 수 있습니다. 그것은 다음과 같습니다:
#include <unistd.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Configuration parameters. Change to fit your site.
Some of these must be string constants. String pasting is used. */
#define UUID "b3b7bd7b-4f00-4848-8af9-33a56f0b8a97"
#define NAME "cryptdisk"
#define MOUNTPOINT "/mnt/1"
/* The next line is optional. If specified, the user won't even be
prompted for the encrypted disk password. */
/* #define KEY_FILE "/root/disk_key_file" */
/* Replacement environment, for safety */
char * replacement_environment[] = {
"PATH=/bin:/usr/bin:/sbin:/usr/sbin",
"HOME=/root",
"TERM=dumb",
0
};
void run(char *exec, ...)
{
#define MAXARGS 20
char *args[MAXARGS];
char *arg;
int count = 0;
va_list ap;
args[count++] = exec;
va_start(ap, exec);
while ((count < MAXARGS) && (arg = va_arg(ap, char *))) {
args[count++] = arg;
}
if (count >= MAXARGS) {
fprintf(stderr, "Too many arguments\n");
exit(127);
}
args[count++] = 0;
pid_t pid = fork();
switch (pid) {
case -1:
perror("fork error");
exit(127);
case 0:
execve(exec, args, replacement_environment);
perror("exec error");
exit(127);
default:
{
pid_t wpid;
int status;
for (;;) {
wpid = wait(&status);
if (wpid == -1) {
perror("wait error");
exit(127);
}
if (pid == wpid) break;
}
if (status != 0) {
if (WIFSIGNALED(status))
fprintf(stderr, "Child %s terminated with signal %d\n", exec, WTERMSIG(status));
else if (WIFEXITED(status))
fprintf(stderr, "Child %s exited with status %d\n", exec, WEXITSTATUS(status));
else
fprintf(stderr, "Child %s exited with result %d\n", exec, status);
exit(126);
}
break;
}
}
}
void do_mount(void)
{
setreuid(0,0);
#ifdef KEY_FILE
run("/sbin/cryptsetup", "--key-file", KEY_FILE, "luksOpen", "UUID="UUID, NAME, NULL);
#else
run("/sbin/cryptsetup", "luksOpen", "UUID="UUID, NAME, NULL);
#endif
run("/bin/mount", "/dev/mapper/"NAME, MOUNTPOINT, NULL);
}
void do_umount(void)
{
setreuid(0,0);
run("/bin/umount", MOUNTPOINT, 0);
run("/sbin/cryptsetup", "luksClose", NAME, 0);
}
int main(int argc, char **argv)
{
char const *prog = argv[0];
char const *last_slash = strrchr(prog, '/');
if (last_slash) prog = last_slash+1;
if (prog[0] == 'u')
do_umount();
else
do_mount();
exit(0);
}
상단 근처의 구성 값을 변경해야 합니다. cryptsetup 매개변수를 추가로 조정해야 하는 경우 이는 매우 분명합니다. " "과(와) 관련시키는 방법에 대해서는 Thunar
도움을 드릴 수 없습니다.
다음과 같이 빌드하세요.
gcc -o mount_it mount_it.c
sudo chown root mount_it
sudo chmod u+s mount_it
ln -s mount_it umount_it