Як додати до файлу як sudo?


271

Я хочу зробити:

echo "something" >> /etc/config_file

Але, оскільки лише користувач root має дозвіл на запис цього файлу, я не можу цього зробити. Але наступне також не працює.

sudo echo "something" >> /etc/config_file

Чи є спосіб додати файл у цій ситуації, не спершу відкривати його за допомогою sudoредактора "d", а потім додавати новий вміст вручну?


Я використовую Ubuntu 9.04 і можу використовувати sudo для кожної команди, яка мені була потрібна до цих пір. Нерест працював під оболонкою.
Метт Норріс

Відповіді:


391

Використовувати tee -a(або tee --append) зsudo

tee - read from standard input and write to standard output and files
[...]
   -a, --append
      append to the given FILEs, do not overwrite
[...]

Так ваша команда стає

echo "something" | sudo tee -a /etc/config_file

Переваги teeнад виконанням Bash з адміністративними дозволами є

  • Ви не виконуєте Bash з адміністративними дозволами
  • Тільки частина "запису в файл" працює з розширеними дозволами
  • Цитування складної команди набагато простіше

2
На OS X tee лише, здається, є прапор -a.
Лрі

Debian 8 teeмає -aпрапор додавання.
глина

9
Використовуйте, echo "output" | sudo tee -a file > /dev/nullякщо ви хочете пропустити вихід консолі.
Моше Біксеншпанер

Також добре працює для WSL.
kayleeFrye_onDeck

50

Перенаправлення виконується в поточній оболонці. Для того щоб зробити перенаправлення з підвищеними привілеями, потрібно запустити саму оболонку з підвищеними привілеями:

sudo bash -c "somecommand >> somefile"

26

Запропонував судо оболонку sudo:

sudo sh -c "echo 'JAVA_HOME=/usr/lib/jvm/java-6-sun' >> /etc/profile"

У цьому прикладі sudo працює "sh" з рештою в якості аргументів.

(це показано як приклад на сторінці sudo man)


8
Причина в тому, що саме ваша оболонка (працює як ви) робить перенаправлення, а не sudo. Оскільки у вас немає дозволу на запис у файл, ви отримуєте помилку відхилення в дозволі. Ця відповідь робить це запустити нову оболонку, яка працює як root, і тому може записати у файл.
Ренді Оррісон

Це не правильна відповідь. Це правильна відповідь. Акіра отримала кращу, за логіку, викладену у цій відповіді.
TOOGAM



3

Тут може виникнути проблема з судо і перенаправленням. Використовуйте текстовий редактор на ваш вибір замість цього, щоб додати рядок.

sudo nano /etc/profile

Або ви можете спробувати су натомість

su
echo ‘JAVA_HOME=/usr/lib/jvm/java-6-sun’ >> /etc/profile
exit

На жаль, це дало такий же результат.
Метт Норріс

1
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile'повинні працювати. оскільки немає нічого, що оболонка може помилково розгорнутись у аргументі, щоб повторити, одноцитуйте загальну команду.
шарлатаний кіхот

Це фантастично. Тепер зробіть це як частина сценарію.
Ерні Данбар

0

Це не спрацює, ви намагаєтесь перенаправити (використовуючи >>) вихід sudo. Те, що ви насправді хочете зробити, це перенаправити вихід echo. Я пропоную вам просто скористатися улюбленим редактором і додати цей рядок вручну /etc/profile. Це має додаткову перевагу, яку ви можете перевірити, чи /etc/profileвже встановлено JAVA_HOME.


0

Використовувати колишній шлях:

sudo ex +'$put =\"FOO\"' -cwq /etc/profile

і замініть FOOйого змінною для додавання.

У деяких системах (таких як OS X) /etc/profileфайл має 444 дозволу, тому якщо ви все-таки отримуєте дозвіл , попередньо перевірте та виправте дозвіл:

sudo chmod 644 /etc/profile

потім спробуйте ще раз.

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