Как изменить пользователя Linux в коде C? - PullRequest
3 голосов
/ 20 декабря 2010

Как изменить пользователя, которого моя программа c идентифицирует как?

Средство командной строки, которое я хочу вызвать автоматически, требует запуска от имени определенного пользователя и иначе работать не будет.

Я пытался использовать setuid(0), но все еще не получил желаемых результатов.

Пользователь, которого я хочу имитировать, - это не root , а обычный непривилегированный пользователь без оболочки. Я хочу, чтобы иметь возможность запустить двоичный файл, вошедший в систему как пользователь никто. Я смог придумать решение как «root», используя:

su -ls /bin/bash -c /binary (суперпользователь)

Однако я хочу иметь возможность войти в систему под тем же именем, что и пользователь nobody

Я что-то упускаю?

Ответы [ 3 ]

6 голосов
/ 20 декабря 2010

Если бы кто-то мог просто стать пользователем root, вставив setuid(0); в свою программу, Unix был бы, ну, Windows.

Некоторые мысли:

  1. Запуск внешних инструментов командной строки из C почти всегда является ошибкой.
  2. Если вам действительно нужен этот инструмент командной строки, действительно ли инструмент должен иметь права root для работы? Если нет, исправьте инструмент (или вернитесь к шагу 1 и включите функциональность в свою собственную программу).
  3. Если вам действительно нужен инструмент и ему действительно нужен root, рассмотрите возможность установки для него разрешений sudo и запуска его через sudo.

Учитывая очень простой вопрос, который вы задаете, вам даже не следует пытаться писать код, который будет запускаться от имени пользователя root, поэтому я не стал подробно рассказывать о том, как настроить права доступа root для вашей программы.

3 голосов
/ 20 декабря 2010

Вам не нужно ничего делать на стороне C. Просто измените двоичный файл, чтобы он принадлежал пользователю, которого вы хотите использовать, включите бит setuid в двоичном файле (chmod u+s), и все готово!

(Если вы не хотите, чтобы какой-либо пользователь мог работать в качестве назначенного вами пользователя, рассмотрите возможность использования sudo.)

1 голос
/ 06 апреля 2015

Чтобы изменить текущий идентификатор пользователя:

Сначала найдите новый идентификатор пользователя, используя getpwnam().Это возвращает struct passwd *pw, и значение NULL будет указывать, что пользователь не выходит.struct содержит идентификатор пользователя (pw_uid) и идентификатор группы (pw_gid), необходимые для выполнения изменения.

if((pw = getpwnam(userid)) == NULL) sprintf(error_msg "Userid '%s' does not exist", userid);

Затем установите идентификатор группы дляновый пользователь

if (setgid(pw->pw_gid) != 0) sprintf(error_msg "setgid() to %d failed", pw->pw_gid);

Наконец, установите идентификатор пользователя для нового пользователя

if (setuid(pw->pw_uid) != 0) sprintf(error_msg "setuid() to %d failed", pw->pw_uid);

Ошибка восстановления во время этого процесса грязная,Самый простой способ - просто прервать работу, если произойдет сбой setgid() или setuid().Настоящая проблема возникает, если смена группы прошла успешно, но смена пользователя не удалась.

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