2011-01-06 2 views
0

Хорошо, поэтому мой вопрос прост, но я не знаком с C, и я надеялся, что кто-то сможет мне помочь. Я хочу изменить другого пользователя на C. Например, я знаю пароль пользователя, и если пользователь вводит: ./change user1 Он изменится на user1. Я знаю, что это может быть проблемой безопасности прямо сейчас, но я не беспокоюсь о безопасности на данный момент.C меняющий пользователь

+2

В C нет такой вещи, как пользователь. Это будет зависеть от используемой операционной системы, и вполне возможно, что не будет никакого способа делать то, что вы хотите. –

+0

Этот вопрос сильно зависит от операционной системы: в какой ОС вы нацеливаетесь? – Thanatos

+0

Вы имеете в виду, что когда они используют «./change user1'», то оболочка теперь будет в другом пользователе? Если это так, для этого уже есть инструмент. – dreamlax

ответ

2

Вы хотите использовать УИП, которые можно найти в unistd.h так что он доступен на POSIX системах (так что любой Linux/Unix falvour должно быть в порядке)

От страницы человека

Если процесс имеет соответствующие привилегии, setuid() должен установить реальный идентификатор пользователя, эффективный идентификатор пользователя и сохраненный идентификатор заданного имени вызывающего процесса на uid.

Если процесс не имеет соответствующих привилегий, но uid равен реальному идентификатору пользователя или сохраненному идентификатору set-user-ID, setuid() должен установить эффективный идентификатор пользователя в uid; реальный идентификатор пользователя и сохраненный идентификатор пользователя должны оставаться неизменными.

Функция setuid() не влияет ни на какой дополнительный список групп.

здесь является example

+1

Это изменяет пользователя только с точки зрения программы, не так ли? то есть пользователь возвращается к исходному пользователю, который вызвал программу, и навсегда не переходит к новому пользователю после завершения программы. – CanSpice

+0

хорошо да. он должен был бы запустить какой-нибудь исполняемый файл после setuid, чтобы на самом деле сделать что-нибудь полезное – hhafez

0

Вы должны узнать UID с помощью getpwuid(). Послесловие вы должны установить UID в своей программе с помощью setuid(), за которым следует приложение/функция, которую вы намерены запускать с этими новыми правами, например. оболочка. Для запуска приложения с использованием тока UID используется system().

1

su Вызвать бинарный (например, через system() или комбинацию fork() и один из exec функций), который знает обо всех тонкостях меняющихся учетных данных, как Unix-общем и на вашей конкретной ОС. Терминал является общим и продолжает принадлежать оригинальному пользователю.

Некоторые из этих сложностей, которые не обрабатываются простым вызовом setuid(), - это группы, отключенные учетные записи и ограничения ресурсов.

Если вам просто интересно, setuid(), которому предшествуют setgid() и initgroups(), вам, вероятно, будет достаточно.