По поводу вашего второго вопроса (тот, что в заголовке): чтобы разрешить создание пользователей с помощью скрипта, запускаемого вашим веб-сервером, вам нужно дать корневые права доступа к веб-серверу - очень опасная вещь.
Таким образом, хотя это, безусловно, возможно (существуют веб-приложения для управления системой, такие как , webmin ), это плохая идея - сделать это самостоятельно с помощью некоторого самописного сценария.
NB. Я не говорю, что использование webmin также безопасно: -)
Вы можете сделать так, чтобы ваш скрипт PHP создавал файл, содержащий информацию о пользователе, не требуя root-доступа. Эта информация должна быть зашифрована, чтобы она не сидела голой.
Тогда у вас может быть bash-скрипт с доступом с правами root, который отслеживает каталог, в котором новая пользовательская информация будет создаваться вашим PHP-скриптом. если новый файл существует, он дешифрует и создает нового пользователя, а затем удаляет файл при успешном создании пользователя (поэтому он не остается там после того, как с ним покончено). Вы бы хотели, чтобы он был очень точным о том, какие данные ищет и принимает ваш bash-скрипт. Также обязательно очистите все поля в пользовательской форме, чтобы минимизировать вероятность внедрения вредоносного кода.
Я не использовал его, но inotify выглядит так, как будто он был разработан для этой цели. http://www.errr-online.com/index.php/2011/02/25/monitor-a-directory-or-file-for-changes-on-linux-using-inotify/
Таким образом, ничто не имеет прямого доступа к вашей корневой области, и вы можете ограничить выполнение bash-скрипта только при соблюдении определенных условий, таких как создание нового файла, прохождение проверки хеш-функции, созданной вашим сценарием, содержащей ожидаемые данные ... Дайте нам знать, как это происходит, и, надеюсь, мы получим дополнительную информацию о наиболее безопасном способе сделать это.
Редактировать: Похоже, что событием, которое вы можете использовать для inotify, является IN_CREATE, которое будет действовать, когда файл создается в наблюдаемом каталоге. Просмотрите руководство, и я уверен, что вы найдете способ сделать это. http://man7.org/linux/man-pages/man7/inotify.7.html
Редактировать: Вы также можете иметь один файл, который открывается и редактируется PHP скрипт. У вас определенно есть варианты, но я не могу притворяться, что знаю, какой из них лучший.
Asumming Apache работает под пользователем www-data
, выполните visudo
и добавьте следующую строку:
www-data ALL=NOPASSWD:/usr/sbin/useradd
Теперь из вашего скрипта PHP:
$username = "user1";
$password = "password1";
$cmd = "sudo /usr/sbin/useradd -m -p `openssl passwd -1 $password` $username";
system($cmd);
Наконец, просто Слово предосторожности, никогда не обращайте на это внимания в производственной среде, предварительно не осознавая последствий для безопасности.