#cpp #linux #qt
У меня есть приложение, писаное на qt5, которому могут понадобиться root права при сохранении файла. То есть пользователь сам выбирает в QFileDialog::getSaveFileName(), куда ему сохранять. И если выберет что-то типа в /etc, то ему могут потребоваться root права. Так вот, как это организовать? То есть запрос root прав должен происходить именно тогда, когда пользователь выберет путь сохранения, по которому без рута нельзя. Кто что посоветует? Есть ли какие-нибудь готовые механизмы для этого?
Ответы
Ответ 1
Мои пять копеек. При помощи QFileInfo проверяется доступность записи (или вообще доступа) при помощи ::permission() или isWritable() или смотреть документацию. Дальше, действительно, вызываем стороннее приложение через su/sudo. Варианта два: Сохраняем файл во временное хранилище (/tmp/XXXX) и при помощи sudo cp скопировать. Для чтения, если не хватает прав, аналогично, но в обратном порядке. Нужно не забывать об исходных правах на доступ и восстановить их потом. Аналогично, но используем sudo cat и sudo tee для чтения и записи используя стандартные потоки ввода и вывода. В данном случае промежуточные файлы не потребуются, но нужно будет плотнее заморочиться с чтением/записью в канал процесса. В обоих случаях нужно читать стандартные поток ошибок и при появлении запроса на ввод пароля вывести диалоговое окно с запросом оного и передать его в stdin процесса + '\n'.Ответ 2
Ваша программа должна изначально запущена в режиме повышенных привилегий (root), то есть она должна быть запущена от пользователя, который имеет доступ к нужной вам директории. Если это не так, то невозможно получить доступ к файлам, потому что операционная система не позволит это сделать. Вы должны выполнить свою программу с использованием sudo. Для получения сведений о правах доступа к файлу, вы можете использовать QFile::permissions()Ответ 3
Есть вариант. Вы можете запустить дочерний процесс от имени суперпользователя, соединиться с ним через пайп и получить таким способом доступ к нужному файлу.
Комментариев нет:
Отправить комментарий