Функция getlogin() c возвращает NULL и ошибку "Нет такого файла или каталога"

У меня есть вопрос, касающийся функции getlogin() (). Я попытался получить логин моей учетной записи из программы c, используя эту функцию. Но функция возвращает NULL. Использование perror показывает, что ошибка "Нет такого файла или каталога".

Я не понимаю, в чем проблема. Есть ли способ получить имя пользователя в программе.

Вот пример кода:

#include <stdio.h>
#include <unistd.h>

int main()
{
  char *name;
  name = getlogin();
  perror("getlogin() error");
  //printf("This is the login info: %s\n", name);
  return 0;
}

И это вывод: getlogin() error: No such file or directory

Пожалуйста, дайте мне знать, как сделать это правильно.

Благодарю.

5 ответов

Решение

getlogin это небезопасный и устаревший способ определения пользователя, вошедшего в систему. Возможно, он пытается открыть запись вошедших в систему пользователей, возможно, utmp или что-то. Правильный способ определения пользователя, с которым вы работаете (который может отличаться от пользователя, вошедшего в систему, но в любом случае почти всегда лучше использовать) getpwuid(getuid()),

Вот хорошая ссылка, которую я нашел, объясняющая, что она может не работать: getlogin

Вот цитата из этого:

К сожалению, часто довольно легко обмануть getlogin(). Иногда это не работает вообще, потому что какая-то программа испортила файл utmp

Это нормально работает для меня, если я прокомментирую perror вызов.

От man:

getlogin () возвращает указатель на строку, содержащую имя пользователя, вошедшего в систему на управляющем терминале процесса, или нулевой указатель, если эта информация не может быть определена.'

Так что вы должны сделать:

#include <stdio.h>
#include <unistd.h>

int main()
{
  char *name;
  name = getlogin();
  if (!name)
    perror("getlogin() error");
  else
    printf("This is the login info: %s\n", name);
  return 0;
}

Согласно справочной странице ошибка (ENOENT) означает:

В utmp-файле не было соответствующей записи.

Обычно я использую getpwent() вместе с вызовами geteuid() и getegid (). Это дает мне всю информацию, которую мне, возможно, понадобится узнать (по крайней мере, настолько, насколько может предложить / etc / passwd), и говорит мне, работаю ли я как setuid / setgid, что полезно при оборонительном программировании.

Я написал несколько программ для своей компании, которые прямо отказываются работать, если кто-то пытается установить их и сменить владельца на root, или отказывается работать от имени root, если его вызывает системный пользователь (www-data, никто и т. Д.).

Как уже говорили другие, читая из utmp это очень плохая идея для этой цели.

Другие вопросы по тегам