Використовуєте sudo su для команд?


15

Я працював над розвитком моїх навичок командного рядка вчора ввечері і зіткнувся з проблемою, коли під час використання судо я отримав повідомлення про помилку, в якому сказано, що "у дозволі відмовлено". Однак коли я застосував "sudo su" і став root, команда спрацювала.

Чому судо не працювало в першу чергу?

Це було:

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

З видання Linux Bible 2010 в розділі про налаштування LAMP-сервера.


Якщо ви не наводите приклад, вирішити проблему важко.
LassePoulsen

1
Поміркуйте sudo -sнад sudo su.
Джеремі Л

Відповіді:


18

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

Якщо оболонкою, в яку ви ввели свою команду, є ваша оболонка для входу або інша оболонка, що працює в терміналі з вашим ідентифікатором користувача, то вона має ті ж привілеї, що і ваш ідентифікатор користувача - не ті, що мають root.

Отже, у вашому випадку, тоді як команда cat виконується як корінь, копіювання її виводу в /var/www/info.phpспробує оболонка, що працює як звичайний користувач, що, як очікується, не вдається.

Вирішенням таких ситуацій є використання teeкоманди:

sudo tee /var/www/info.php

Це матиме намічений ефект від розміщення всього тексту, введеного на консолі до ^ D, у файл, вказаний як параметр.

Один, можливо, небажаний побічний ефект - це те tee, що також буде відлунювати вихід у stdout, тому після набору кожного рядка та натискання клавіші enter teeвиведете його копію назад. Щоб уникнути цього, можна скористатися наступним варіантом.

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

Деталі про те teeможна отримати info teeна терміналі.


2

sudo не працює для команд, яким потрібні дозволи для написання файлу, наприклад:

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

Це пояснюється на сторінці людини по судо.


4
Якщо згадка про те, що ви можете "sudo -i" або "sudo -s" отримати кореневу підказку, зробить цю відповідь ще краще!
Хорхе Кастро

У команді example немає труби; відбувається перенаправлення. Крім того, "іноді не працює", схоже, передається невміла поведінка sudo. Як зазначається у відповіді кушика, поведінка є досить передбачуваною, послідовною та "правильною" для моделі дозволу unix.
msw

2

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

Ваш інтерпретатор команд не має кореневих повноважень (але команда sudo з часом пізніше), тому він не може перенаправляти вихід на foo.txt.


1

Ще один спосіб вирішити це - запустити підзаголовок із sudo та виконати цю команду в цій підкашлі:

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

тут команда, що має "sudo" - це bash, і все, що виконується в ній, має кореневі дозволи.

$ 2с, * -піка

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.