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

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

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

Это было:

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

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

15
задан 24 September 2010 в 23:35

4 ответа

& lt ;,> и >> используются для перенаправления ввода / вывода для команд - это функция, предоставляемая оболочкой (например, 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 на терминале.

0
ответ дан 24 September 2010 в 23:35

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

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

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

$ 2c, * -pike

0
ответ дан 24 September 2010 в 23:35

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

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

Это объясняется на man-странице sudo.

0
ответ дан 24 September 2010 в 23:35

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

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

0
ответ дан 24 September 2010 в 23:35

Другие вопросы по тегам:

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