Использование sudo su для команд?

15

Вчера вечером я работал над развитием своих навыков командной строки и столкнулся с проблемой, когда при использовании sudo я получал сообщение об ошибке «Отказано в доступе». Однако когда я использовал sudo su и стал root, команда работала.

Почему sudo не работает в первую очередь?

Это было:

$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D

Из издания Linux Bible 2010 в разделе о настройке сервера LAMP.

wdypdx22
источник
Если вы не приведете пример, решить проблему будет сложно.
LassePoulsen
1
Подумайте sudo -sнад sudo su.
Джереми Л

Ответы:

18

<,> И >> используются для перенаправления ввода / вывода для команд - это функция, предоставляемая оболочкой (например, bash). Таким образом, если вы наберете подобную sudo cat > /var/www/info.phpкоманду, оболочка, получающая ее в качестве ввода, попытается открыть файл /var/www/info.phpи предоставит этот файл в качестве стандартного вывода sudoкоманды. sudoКоманда даже не знает , будет ли его выход происходит на консоль или перенаправлен в файл, так как это позаботятся оболочки , что вызывает его.

Если оболочкой, в которую вы ввели вашу команду, является ваша оболочка входа в систему или другая оболочка, работающая в терминале с вашим идентификатором пользователя, то у нее те же привилегии, что и у вашего идентификатора пользователя, но не привилегии root.

Так что в вашем случае, хотя команда cat выполняется от имени пользователя root, копирование ее выходных данных /var/www/info.phpвыполняется оболочкой, работающей от имени обычного пользователя, что, как и ожидалось, завершается неудачей.

Обходной путь для таких ситуаций должен использовать teeкоманду:

sudo tee /var/www/info.php

Это приведет к тому, что весь текст, введенный на консоли, будет помещен до ^ D в файл, указанный в качестве параметра.

Один, возможно, нежелательный побочный эффект заключается в том, что teeон также выводит вывод на стандартный вывод, поэтому после того, как вы введете каждую строку и нажмете Enter, вы teeполучите ее копию обратно. Чтобы избежать этого, вы можете использовать следующий вариант.

sudo tee /var/www/info.php > /dev/null

Подробности teeможно узнать через info teeтерминал.

Koushik
источник
2

sudo не работает для команд, которым необходимы разрешения для записи файла, например:

sudo echo "vm.swappines = 100" >> /etc/sysctl.conf

Это объясняется на странице руководства sudo.

NightwishFan
источник
4
Упоминание о том, что вы можете использовать «sudo -i» или «sudo -s» для получения приглашения root, сделало бы этот ответ еще лучше!
Хорхе Кастро
В примере команды нет канала; есть перенаправление. Кроме того, «иногда не работает», кажется, передает неправильное поведение sudo. Как отмечается в ответе Коушика, поведение является вполне предсказуемым, последовательным и «правильным» для модели разрешений Unix.
2010 г.
2

Проблема в том, что часть «> foo.txt» интерпретируется и выполняется вашим интерпретатором команд (оболочкой) задолго до запуска команды sudo. Команда sudo не подозревает, что вы хотите перенаправить вывод в файл.

У вашего интерпретатора команд нет прав доступа root (но команда sudo будет позже), поэтому он не может перенаправить вывод в foo.txt.

Турбьерн Равн Андерсен
источник
1

Другим способом решения этой проблемы является запуск подоболочки с помощью sudo и выполнение этой команды в подоболочке:

$ sudo bash -c "cat > /var/www/info.php"
<?php
phpinfo( ) ;
? >
^D

здесь команда "имеет sudo" - bash, и все, что выполняется в ней, имеет права root.

$ 2c, * -pike

commonpike
источник