Получить домашний каталог в Linux - PullRequest
58 голосов
/ 26 мая 2010

Мне нужен способ получить домашний каталог пользователя в программе C ++, работающей в Linux. Если тот же код работает на Unix, было бы неплохо. Я не хочу использовать значение среды HOME.

AFAIK, корневой домашний каталог - / root. Можно ли создавать в этом каталоге некоторые файлы / папки, если моя программа запущена пользователем root?

Ответы [ 3 ]

85 голосов
/ 26 мая 2010

Вам необходимо getuid, чтобы получить идентификатор пользователя текущего пользователя, а затем getpwuid, чтобы получить ввод пароля (включая домашний каталог) этого пользователя:

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>

struct passwd *pw = getpwuid(getuid());

const char *homedir = pw->pw_dir;

Примечание: если вам нужно это в многопоточном приложении, вам нужно вместо этого использовать getpwuid_r.

60 голосов
/ 02 ноября 2014

Сначала вы должны проверить переменную окружения $HOME и, если она не существует, использовать getpwuid.

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>

const char *homedir;

if ((homedir = getenv("HOME")) == NULL) {
    homedir = getpwuid(getuid())->pw_dir;
}

Также обратите внимание, что если вы хотите, чтобы домашний каталог сохранял данные конфигурации или кэшировал данные как часть программы, которую вы пишете и хотите распространять среди пользователей, вам следует рассмотреть возможность соблюдения Базовой директории XDG . Например, если вы хотите создать каталог конфигурации для вашего приложения, вы должны сначала проверить $XDG_CONFIG_HOME, используя getenv, как показано выше, и возвращаться к приведенному выше коду, только если переменная не установлена.

Если вам требуется многопоточная безопасность, вы должны использовать getpwuid_r вместо getpwuid, как это (со страницы руководства getpwnam(3)):

struct passwd pwd;
struct passwd *result;
char *buf;
size_t bufsize;
int s;
bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
if (bufsize == -1)
    bufsize = 0x4000; // = all zeroes with the 14th bit set (1 << 14)
buf = malloc(bufsize);
if (buf == NULL) {
    perror("malloc");
    exit(EXIT_FAILURE);
}
s = getpwuid_r(getuid(), &pwd, buf, bufsize, &result);
if (result == NULL) {
    if (s == 0)
        printf("Not found\n");
    else {
        errno = s;
        perror("getpwnam_r");
    }
    exit(EXIT_FAILURE);
}
char *homedir = result.pw_dir;
0 голосов
/ 26 мая 2010

Если вы запускаете программу от имени пользователя root, у вас будет доступ к этому каталогу через rwx. Я думаю, что создавать вещи внутри - это хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...