Почему пользователи никогда не должны использовать обычный sudo для запуска графических приложений?


114

Я прочитал документацию сообщества "RootSudo" и заинтересован в этой строке:

Вы никогда не должны использовать обычный sudo для запуска графических приложений от имени Root.

Почему? В чем разница? Пожалуйста, предоставьте простое объяснение, так как я обычный пользователь рабочего стола.



На самом деле, недавно мне было трудно установить MATLAB в / usr / local. Для этого требовались права суперпользователя для записи в / usr / local, но запуск установщика с использованием gksu как-то сделал невозможным запуск установленной программы без полномочий root. Запустив установщик с помощью sudo, все заработало.
Нагрудник потерян

Ответы:


129

Графические приложения часто хранят настройки и другие пользовательские данные в файлах конфигурации, записанных в домашней папке пользователя . Основным механизмом, который приложения используют для определения того, что они должны использовать в качестве домашней папки пользователя, является HOME переменная окружения . (Вы можете проверить это сами echo $HOME).

Предположим, вы работаете gedit(графический текстовый редактор) как root. Если вы запустите sudo gedit, HOMEбудет продолжать указывать на ваш домашний каталог, даже если программа работает какroot . Следовательно, geditфайлы конфигурации будут записываться какroot в ваш домашний каталог. Это иногда приводит в файлах конфигурация будучи принадлежащий наroot и , следовательно , недоступные для вас (если вы позже запустить программу , как сами себя , а не как root). В основном это происходит, когда приложение должно создать новый файл конфигурации. По умолчанию вновь созданные файлы принадлежат пользователю, который их создает (в данном случае это rootне вы).

Это основная причина, почему вы должны запускать графические приложения с графическим sudoинтерфейсом, а не с прямым sudo. В Ubuntu и большинстве его производных (включая Xubuntu и Lubuntu) стандартным графическим интерфейсом является gksu/gksudo . В Кубунту это так kdesudo. (Это зависит от используемой среды рабочего стола .)

Если вы хотите использовать sudoнепосредственно для запуска графического приложения, как gedit, вы можете запустить:

sudo -H gedit

-HФлаг делает sudoнабор , HOMEчтобы указать на root«s домашней папки (это /root).

Это все равно не будет автоматически обрабатывать владение .Xauthority, копируя его во временную папку (это еще одна вещь, о которой sudoзаботятся графические интерфейсы). Но в нечастом событии, .Xauthorityкоторое недоступно, вы получите сообщение об ошибке, и это можно исправить, удалив его ( sudo rm ~/.Xauthority), так как он автоматически создается заново. Таким образом, защита .Xauthorityвладения и разрешений менее важна, чем защита владения и разрешений файлов конфигурации.

В отличие от root-owned .Xauthority, когда файлы конфигурации становятся собственностью as root, проблема не всегда очевидна (поскольку графические программы часто работают, но работают не очень хорошо и выводят любые полезные ошибки на консоль). И иногда это труднее исправить, особенно если вы находитесь в ситуации, когда вы хотите, чтобы один или несколько файлов в вашем домашнем каталоге принадлежали кому-то, кроме вас (потому что тогда вы не можете это исправить, просто рекурсивно chownизвлекая все свои файлы обратно к себе).

Поэтому sudo(по крайней мере, без -H) не следует использовать для запуска графического приложения, если вы не очень хорошо знакомы с внутренней работой приложения и точно знаете, что оно никогда не пытается писать какие-либо файлы конфигурации.


Могу ли я снова стать владельцем всех файлов конфигурации (или любых файлов) в моем домашнем каталоге, если эти файлы принадлежат пользователю root?
Нур

@Nur Предполагая, что в вашем домашнем каталоге нет файлов, которыми вы хотите владеть для любого другого пользователя или для которых вы хотите иметь какое-либо другое членство в группе (для общего доступа) , вы можете выполнить: sudo chmod -R $USER:$USER ~К сожалению, эти критерии не всегда применяются. Если у вас есть какие-либо файлы, где вам нужно сохранить владельца группы, вы можете запустить sudo chmod -R $USER ~. Обычно этого достаточно. (Если у вас есть файлы, которые должны принадлежать другому пользователю в вашем домашнем каталоге, даже это будет проблемой.)
Элия ​​Каган

1
@EliahKagan На chmodсамом деле это делает? Я всегда думал, что chownэто сделал это. chmodникогда не делал это для меня.
Wyatt8740 10.09.15

2
@ Wyatt8740 Я бы определенно написал, chownа не chmodв моих комментариях выше. Извините за это - и спасибо за указание на это!
Элия ​​Каган,

2
@TheQuark В sudo -H echo $HOME, ваша оболочка - работает , как вы, а не суперпользователя - выполняет разложение параметра на $HOME, получая путь вашей домашней директории, а затем передает его sudo, в свою очередь , проходит уже расширенное значение echo, которое выводит его. sudo -H printenv HOME, sudo -H bash -c 'echo $HOME'И sudo -H sh -c 'echo $HOME'все печати /root. Концептуально это похоже - хотя и с помощью другого механизма - на то, как x=a echo "$x"не печатать a(если xуже не было значения a).
Элия ​​Каган

25

Проще говоря:

Это предотвращает принадлежность файлов в вашем домашнем каталоге пользователю root.

Прочитайте это здесь . Кроме того, возможно, дубликат В чем разница между "gksudo nautilus" и "sudo nautilus"?


gksudo больше не входит в установки Ubuntu и Debian. См. Itsfoss.com/gksu-replacement-ubuntu для деталей. askubuntu.com/a/1047413/197910 теперь является превосходным решением.
K7AAY

5

Альтернативой gksu nautilusи gksu geditявляется использование nautilus-adminдополнения. Это позволяет вам просматривать файлы и каталоги с помощью Nautilus, а затем открывать их как root (администратор).

Установка прямо вперед:

sudo apt install nautilus-admin

Теперь, когда вы находитесь в nautilus, у вас будет дополнительная опция Редактировать как администратор:

Наутилус admin.gif


gedit как root не позволяет настройки

Когда вы запускаете geditот имени пользователя root, вы не можете использовать настройки, которые вы установили в качестве обычного пользователя, для остановки табуляции, преобразования табуляции в пробелы, имени шрифта, размера шрифта, переноса строк и т. Д.

Чтобы решить эту проблему, я написал скрипт sgeditдля наследования пользовательских настроек и применения их к root: Как я могу синхронизировать мой корневой gedit с настройками моего пользовательского gedit?

  • Звонить используя sgedit filename1 filename2 ...
  • Получает пользовательские настройки gedit для табуляции, шрифтов, переноса строк и т. Д.
  • Повышает уровень, чтобы sudo -Hсохранить владение файлом, получая полномочия root.
  • Запрашивает пароль, если последний sudoраз истек.
  • Получает настройки gedit sudo
  • Сравнивает различия между настройками пользователя и sudo gedit
  • Запускает gsettings, установленные только для различий (уменьшает 174 набора команд до дюжины или меньше. В следующий раз, когда он запускается, возможно, только одно или два изменения, но часто без изменений.
  • Вызывается geditкак фоновая задача, так что подсказка терминала появляется снова немедленно.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.