Хорошо, поэтому мой вопрос прост, но я не знаком с C, и я надеялся, что кто-то сможет мне помочь. Я хочу изменить другого пользователя на C. Например, я знаю пароль пользователя, и если пользователь вводит: ./change user1 Он изменится на user1. Я знаю, что это может быть проблемой безопасности прямо сейчас, но я не беспокоюсь о безопасности на данный момент.C меняющий пользователь
ответ
Вы хотите использовать УИП, которые можно найти в unistd.h
так что он доступен на POSIX системах (так что любой Linux/Unix falvour должно быть в порядке)
От страницы человека
Если процесс имеет соответствующие привилегии, setuid() должен установить реальный идентификатор пользователя, эффективный идентификатор пользователя и сохраненный идентификатор заданного имени вызывающего процесса на uid.
Если процесс не имеет соответствующих привилегий, но uid равен реальному идентификатору пользователя или сохраненному идентификатору set-user-ID, setuid() должен установить эффективный идентификатор пользователя в uid; реальный идентификатор пользователя и сохраненный идентификатор пользователя должны оставаться неизменными.
Функция setuid() не влияет ни на какой дополнительный список групп.
здесь является example
Это изменяет пользователя только с точки зрения программы, не так ли? то есть пользователь возвращается к исходному пользователю, который вызвал программу, и навсегда не переходит к новому пользователю после завершения программы. – CanSpice
хорошо да. он должен был бы запустить какой-нибудь исполняемый файл после setuid, чтобы на самом деле сделать что-нибудь полезное – hhafez
Вы должны узнать UID с помощью getpwuid(). Послесловие вы должны установить UID в своей программе с помощью setuid(), за которым следует приложение/функция, которую вы намерены запускать с этими новыми правами, например. оболочка. Для запуска приложения с использованием тока UID используется system().
su
Вызвать бинарный (например, через system()
или комбинацию fork()
и один из exec
функций), который знает обо всех тонкостях меняющихся учетных данных, как Unix-общем и на вашей конкретной ОС. Терминал является общим и продолжает принадлежать оригинальному пользователю.
Некоторые из этих сложностей, которые не обрабатываются простым вызовом setuid()
, - это группы, отключенные учетные записи и ограничения ресурсов.
Если вам просто интересно, setuid()
, которому предшествуют setgid()
и initgroups()
, вам, вероятно, будет достаточно.
В C нет такой вещи, как пользователь. Это будет зависеть от используемой операционной системы, и вполне возможно, что не будет никакого способа делать то, что вы хотите. –
Этот вопрос сильно зависит от операционной системы: в какой ОС вы нацеливаетесь? – Thanatos
Вы имеете в виду, что когда они используют «./change user1'», то оболочка теперь будет в другом пользователе? Если это так, для этого уже есть инструмент. – dreamlax