Как добавить в файл как 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 у тройника только флаг -a.
Lri

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)


8
Причина в том, что ваша оболочка (работает как вы) выполняет перенаправление, а не sudo. Поскольку у вас нет разрешения на запись в файл, вы получаете ошибку «Отказано в доступе». Что этот ответ делает, так это запускает новую оболочку, которая работает от имени пользователя root и, следовательно, может записывать в файл.
Рэнди Оррисон

Это не правильный ответ. Это правильный ответ. У Акиры есть лучшая из-за логики, представленной в этом ответе.
TOOGAM


4

На мой взгляд, лучшим в этом случае является дд:

sudo dd of=/etc/profile <<< END
JAVA_HOME=/usr/lib/jvm/java-6-sun
END

3

Здесь может быть проблема с sudo и перенаправлением. Используйте текстовый редактор по вашему выбору, чтобы добавить строку.

sudo nano /etc/profile

Или вы можете попробовать вместо этого su

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'должно сработать. поскольку нет ничего, что оболочка может ошибочно развернуть в arg, чтобы повторить, заключите в кавычки всю команду.
шарлатан-кихот

Это фантастично. Теперь сделайте это как часть сценария.
Эрни Данбар

0

Это не сработает, вы пытаетесь перенаправить (используя >>) вывод sudo. Что вы действительно хотите сделать, это перенаправить вывод echo. Я предлагаю вам просто использовать ваш любимый редактор и добавить эту строку вручную /etc/profile. Это имеет дополнительное преимущество, которое вы можете проверить, если /etc/profileуже устанавливает JAVA_HOME.


0

Используйте ex -way:

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.