Google Drive SDK — Удаление запроса пароля ‘su’ из программы на C ++

Я использую систему 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).

[1] http://www.techrepublic.com/article/how-to-mount-your-google-drive-on-linux-with-google-drive-ocamlfuse/

[2] https://stackoverflow.com/a/8108474/7842054

//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«внутри этого инструмента будет удалить запрос пароля для пользователя? Любая помощь будет принята с благодарностью.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]