Вчера вечером я работал над развитием своих навыков командной строки и столкнулся с проблемой, когда при использовании sudo я получал сообщение об ошибке «Отказано в доступе». Однако когда я использовал sudo su и стал root, команда работала.
Почему sudo не работает в первую очередь?
Это было:
$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D
Из издания Linux Bible 2010 в разделе о настройке сервера LAMP.
command-line
wdypdx22
источник
источник
sudo -s
надsudo su
.Ответы:
<,> И >> используются для перенаправления ввода / вывода для команд - это функция, предоставляемая оболочкой (например, bash). Таким образом, если вы наберете подобную
sudo cat > /var/www/info.php
команду, оболочка, получающая ее в качестве ввода, попытается открыть файл/var/www/info.php
и предоставит этот файл в качестве стандартного выводаsudo
команды.sudo
Команда даже не знает , будет ли его выход происходит на консоль или перенаправлен в файл, так как это позаботятся оболочки , что вызывает его.Если оболочкой, в которую вы ввели вашу команду, является ваша оболочка входа в систему или другая оболочка, работающая в терминале с вашим идентификатором пользователя, то у нее те же привилегии, что и у вашего идентификатора пользователя, но не привилегии root.
Так что в вашем случае, хотя команда cat выполняется от имени пользователя root, копирование ее выходных данных
/var/www/info.php
выполняется оболочкой, работающей от имени обычного пользователя, что, как и ожидалось, завершается неудачей.Обходной путь для таких ситуаций должен использовать
tee
команду:Это приведет к тому, что весь текст, введенный на консоли, будет помещен до ^ D в файл, указанный в качестве параметра.
Один, возможно, нежелательный побочный эффект заключается в том, что
tee
он также выводит вывод на стандартный вывод, поэтому после того, как вы введете каждую строку и нажмете Enter, выtee
получите ее копию обратно. Чтобы избежать этого, вы можете использовать следующий вариант.Подробности
tee
можно узнать черезinfo tee
терминал.источник
sudo не работает для команд, которым необходимы разрешения для записи файла, например:
sudo echo "vm.swappines = 100" >> /etc/sysctl.conf
Это объясняется на странице руководства sudo.
источник
sudo
. Как отмечается в ответе Коушика, поведение является вполне предсказуемым, последовательным и «правильным» для модели разрешений Unix.Проблема в том, что часть «> foo.txt» интерпретируется и выполняется вашим интерпретатором команд (оболочкой) задолго до запуска команды sudo. Команда sudo не подозревает, что вы хотите перенаправить вывод в файл.
У вашего интерпретатора команд нет прав доступа root (но команда sudo будет позже), поэтому он не может перенаправить вывод в foo.txt.
источник
Другим способом решения этой проблемы является запуск подоболочки с помощью sudo и выполнение этой команды в подоболочке:
здесь команда "имеет sudo" - bash, и все, что выполняется в ней, имеет права root.
$ 2c, * -pike
источник