Перейдите в Центр управления -> Внешний вид -> Windows -> Общие
Снимите флажок «Включить оконный менеджер программного композитинга»
sudo bash -c
и sudo
существенно различаются, потому что sudo
можно настроить для предоставления разрешений конкретным пользователям, выполняющим определенные команды. Таким образом, вы можете оказаться в ситуации, когда вам разрешено запускатьsudo command
(для некоторого значения command
), но не sudo bash
.
В общем, лучше быть как можно более конкретным, поэтому отдавайте предпочтение sudo command
вместо sudo bash -c command
.
Использование bash -c
с sudo может быть значительно более опасным, чем sudo
отдельно. При выполнении команды в оболочке существует множество специальных символов, которые оболочка обрабатывает и расширяет различными способами. Например, rm *.txt
, это оболочка (, обычно bash ), которую вы вводите, при этом расширяется *.txt в список файлов в текущей папке, оканчивающихся на.txt. Команда sudo из-за стремления к простоте и безопасности этого не делает. Вместо этого он просто запускает команду напрямую с именно теми аргументами, которые вы ей передаете. Например, допустим, вы запускаете в оболочке следующее:
$ file=/etc/passwd
$ sudo vim $file
$ ls *.txt
hello.txt world.txt
$ sudo rm *.txt
Первая строка устанавливает переменную $file
в вашей текущей оболочке, запускает команду sudo как sudo vim /etc/passwd
, затем перечисляет и sudo удаляет все текстовые файлы. Это была оболочка, расширяющая эту переменную и подстановочный знак имени файла, прежде чем sudo когда-либо имел возможность увидеть или запустить ее. В последней строке при вызове sudo было указано ровно три аргумента: rm
, hello.txt
и world.txt
. Затем он вызвал rm
от имени пользователя root ровно с двумя аргументами без дальнейшей обработки. Если бы я использовал кавычки вокруг него, например, sudo rm "*.txt"
, тогда вместо этого sudo увидит и вызовет команду rm
с одним аргументом *.txt
. Команда rm воспримет это буквально и попытается удалить файл с именем «*.txt» и обнаружит, что он не существует. Он даже не смотрел на два других файла, которые заканчиваются на.txt. Это расширение выполняется оболочкой.
Просто чтобы донести мысль, когда вы уберете магию, которую делает оболочка, чтобы облегчить жизнь,перечисленные выше команды должны быть написаны напрямую без каких-либо переменных или подстановочных знаков, подобных этой:
$ sudo vim /etc/passwd
$ ls hello.txt world.txt
hello.txt world.txt
$ sudo rm hello.txt world.txt
Никто из ls
, rm
и sudo
сам по себе не знает, как расширять *.txt или $file
, это работа оболочки. Теперь давайте посмотрим, где bash -c
может быть опасен внутри sudo. Пожалуйста, не пытайтесь повторить это дома:
$ file=/etc/passwd
$ sudo vim $file
# Take a short break from your computer here...
$ file="/lets/be/malicious; cp /dev/zero /dev/sda"
$ sudo vim $file # Might see a harmless error here
$ sudo bash -c "vim $file" # Goodbye hard-drive
Хотя я должен признать, что это очень надуманный пример, я надеюсь, что не слишком сложно представить некоторые потенциальные опасности, которые могут возникнуть здесь. Проблема в том, что теперь вы даете оболочке расширять метасимволы -от имени пользователя root. Допустим, вы ушли, и кто-то изменил переменную файла, чтобы внедрить в нее вредоносную команду, которая сотрет ваш жесткий диск. С прежним синтаксисом sudo vim $file
он расширит его как обычный непривилегированный пользователь и потерпит неудачу. При втором использовании он расширит $file и всю встроенную в него магию для работы в полноценной -оперированной оболочке, работающей от имени пользователя root.