Функция 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
это очень плохая идея для этой цели.