Запуск команды без использования exec(), но смена пользователя с помощью php
Я пытаюсь написать скрипт, который позволит кому-то зарегистрироваться и когда он введет свой открытый ключ pgp. Это кажется достаточно простым.
Вот то, на чем я застрял.
У меня есть настройки ключей под системным пользователем, поэтому, когда я хочу добавить ключ, я должен сделать:
sudo -u encryption /usr/bin/gpg --homedir /var/gpg/.gnupg --keyserver hkp://keys.keyserver.org --search [email protected] ( or --import key.asc )
(шифрование является системным пользователем)
Поэтому, когда пользователь регистрируется, мне нужен его ключ, чтобы перейти в нужное место, что означает, что я должен sudo, что из того, что я вижу, означает, что я должен выполнить exec().
Чтобы я мог:
$command = "insert command string to be executed here";
$oldhome = getEnv("HOME");
putenv("HOME=/var/gpg/.gnupg");
$result = exec($command, $output, $errorcode);
putenv("HOME=$oldhome");
Я предполагаю, что использование exec () не одобряется, не говоря уже о необходимости sudo для другого пользователя. Плюс, это просто не кажется мне правильным.
Также из того, что я прочитал, часть sudo должна быть сделана с sudo без пароля.
%admin ALL=(ALL) NOPASSWD: ALL
Также закомментируйте следующую строку (в /etc/sudoers через visudo), если она есть:
Defaults requiretty
Есть ли лучший, более безопасный способ сделать это? Я думаю, что я мог бы переместить связку ключей, чтобы сказать www-данные, но я не уверен, что последствия этого. Брелок используется почтовым сервером для шифрования почты, поэтому его действительно можно переместить куда угодно.
Я надеюсь это имеет смысл. Благодарю.
ОБНОВИТЬ:
Я очень хорошо могу ошибаться здесь, но вот как я "решил это"
www-data ALL=(encryption) NOPASSWD:/usr/bin/gpg
Это то, что было в моем файле sudoers. Это действительно позволяет ему выполнять только эту команду, если я не ошибаюсь в чтении, если да, пожалуйста, дайте мне знать.
Таким образом, я могу запустить exec (), и теперь единственное, о чем я должен беспокоиться, это проверка данных.