Стоит ли всегда использовать «sudo bash -c» вместо «sudo»?

Перейдите в Центр управления -> Внешний вид -> Windows -> Общие

Снимите флажок «Включить оконный менеджер программного композитинга»

4
25.08.2021, 13:17
2 ответа

sudo bash -c и sudoсущественно различаются, потому что sudoможно настроить для предоставления разрешений конкретным пользователям, выполняющим определенные команды. Таким образом, вы можете оказаться в ситуации, когда вам разрешено запускатьsudo command(для некоторого значения command), но не sudo bash.

В общем, лучше быть как можно более конкретным, поэтому отдавайте предпочтение sudo commandвместо sudo bash -c command.

11
25.08.2021, 14:03

Использование 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.

5
26.08.2021, 01:06

Теги

Похожие вопросы