Я использую систему Ubuntu 16.04 LTS. Вся система содержится в одном разделе (/dev/sda1
). Я пытаюсь написать инструмент на C ++, который запускается от имени пользователя root и использует ‘su
‘команда для запуска команды для пользователя инструмента для достижения конкретной задачи. Причина, по которой я хочу, чтобы инструмент запускался от имени пользователя root, заключается в том, что я хочу избежать запроса пароляsu
для пользователя. (В терминале, если вы вошли в систему как root, ‘su
«Другой пользователь никогда не запрашивает пароль. Я хотел бы иметь такое же поведение в рамках программы C ++.)
Если бы я хотел вдаваться в подробности, я хочу разрешить монтирование диска Google пользователя, параметры монтирования которого (включая точку монтирования) указаны в записи в /etc/fstab
файл, по mount
Команда выдана пользователем. В этой статье TechRepublic я нашел инструмент, который монтирует диск Google в указанную точку монтирования [1]. Я запустил инструмент как обычный пользователь, чтобы разрешить ему доступ к моему диску Google, и могу успешно запустить инструмент для монтирования диска. Я хотел автоматизировать это, поместив запись в /etc/fstab
файл и обнаружил, что в этом ответе [2] было возможно на связанный вопрос, поэтому я написал следующий код C ++, скомпилировал его, передал права на его исполняемый файл root, установил исполняемый файл setuid
немного и положить его в /usr/local/sbin
каталог (как /usr/local/sbin/mount-google-drive
).
//mount-google-drive.cc
#include <iostream>
#include <cstdlib>
#include <string>
int main(int argc, char* argv[])
{
if (std::system("which google-drive-ocamlfuse > /dev/null"))
{
std::cout << argv[0] <<
" needs 'google-drive-ocamlfuse' to mount the drive." << std::endl;
return 1;
}
if (argc < 3)
{
std::cout << "Usage: " << argv[0] <<
"<label> <mount point> [google-drive-ocamlfuse options]" << std::endl;
return 0;
}
// Compile the mount command.
std::string mount_command = (std::string) "google-drive-ocamlfuse -label " +
argv[1];
for (int i = 2; i < argc; i++)
{
mount_command += (std::string) " " + argv[i];
}
std::string system_command = (std::string) "su $USER -l -c \"" + mount_command + "\"";
// Output the compiled command
std::cout << system_command << std::endl;
// Run the mount command to mount the google drive for the user.
std::system(system_command.c_str());
return 0;
}
Затем я поместил эту запись в /etc/fstab
файл:
# This is to allow the 'GoogleDrive' remote filesystem to be mounted locally
mount-google-drive#default /media/GoogleDrive fuse user,noauto 0 0
И создал /media/GoogleDrive
точка монтирования доступна моей учетной записи обычного пользователя.
С этими изменениями я могуmount /media/GoogleDrive
‘как обычный пользователь, но, как обычный пользователь, мне всегда предлагается ввести пароль.
Моя конечная цель — разрешить приложению монтировать диск на моем рабочем столе gnome для монтирования диска Google. Приложение распознает только записи в /etc/fstab
файл.
Что касается запуска инструмента от имени пользователя root, я прав в том понимании, что владение инструментом от имени пользователя root и наличие его setuid
набор битов заставит инструмент работать от имени пользователя root? Значит ли это, что бегsu
«внутри этого инструмента будет удалить запрос пароля для пользователя? Любая помощь будет принята с благодарностью.
Задача ещё не решена.
Других решений пока нет …