Вопрос: Как добавить в файл как sudo?


Возможный дубликат:
sudo невозможно записать в / etc / profile 

Я хочу делать:

echo "something" >> /etc/config_file

Но, поскольку только пользователь root имеет право на запись в этот файл, я не могу этого сделать. Но следующее также не работает.

sudo echo "something" >> /etc/config_file

Есть ли способ добавить к файлу в этой ситуации, не открывая сначала его с помощью sudo'd, а затем добавить новый контент вручную?


216
2018-05-01 05:50


Источник


Я использую Ubuntu 9.04 и могу использовать sudo для каждой команды, которая мне нужна до сих пор. Нерест работал. - Matt Norris
Сильно связаны: Перенаправление stdout в файл, на который у вас нет разрешения на запись(в Unix и Linux). Слабо связаны: ls с каталогом путь показывает файлы, но ls с шаблоном файла нет? - Scott


Ответы:


Правильный инструмент для правильной задачи:тройник'

tee - read from standard input and write to standard output and files

Таким образом, ваша

% echo "output" | sudo tee -a file

Преимущество tee над выполнением Bash с административными правами:

  • Вы не выполняете Bash с правами администратора
  • Только часть «писать в файл» работает с расширенными разрешениями
  • Цитирование сложной команды намного проще

322
2018-05-01 06:25



На OS X tee только есть флаг -a. - user495470
Debian 8 tee имеет -a добавить флаг. - clay
использование echo "output" | sudo tee -a file > /dev/null если вы хотите пропустить консольный вывод. - Moshe Bixenshpaner
Хорошо работает и для WSL. - kayleeFrye_onDeck


Перенаправление выполняется в текущей оболочке. Чтобы выполнить перенаправление с повышенными привилегиями, вы должны запустить оболочку с повышенными привилегиями:

sudo bash -c "somecommand >> somefile"

38
2018-05-01 05:54





Попросите sudo создать суб-оболочку:

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

В этом примере sudo запускает «sh», а остальные - в качестве аргументов.

(это показано в качестве примера на странице sudo man)


22
2017-10-13 14:23



Причина в том, что это ваша оболочка (работает как вы), которая выполняет перенаправление, а не sudo. Поскольку у вас нет разрешения на запись в файл, вы получаете ошибку отказа от разрешения. Этот ответ заключается в том, чтобы запустить новую оболочку, которая работает от имени root, и, следовательно, может записывать файл. - Randy Orrison
Это неправильный ответ. Это правильный ответ. У Акиры есть лучшая, для логики, приведенной в этом ответе. - TOOGAM


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

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

4
2018-04-18 18:03





Обычно я использую shell ЗДЕСЬ документ с sudo tee -a, Что-то вроде:

sudo tee -a /etc/profile.d/java.sh << 'EOF'
# configures JAVA
JAVA_HOME=/usr/lib/jvm/java-8-oracle
export JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin
EOF

4
2018-06-16 16:16





Там может быть проблема с sudo здесь и перенаправление. Вместо этого используйте текстовый редактор, чтобы добавить строку.

sudo nano /etc/profile

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

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

3
2017-10-13 14:10



К сожалению, это привело к такому же результату. - Matt Norris
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile' должно сработать. так как нет ничего, что оболочка может ошибочно расширять в arg для эха, одинарная кавычка общей команды. - quack quixote
Это круто. Теперь сделайте это как часть скрипта. - Ernie Dunbar


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


0
2017-10-13 14:36





использование бывший-путь:

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

и заменить FOO с добавлением переменной.

В некоторых системах (например, OS X) /etc/profile файл имеет 444 разрешения, поэтому, если вы все еще получаете доступ запрещен, сначала проверьте и исправьте разрешение:

sudo chmod 644 /etc/profile

затем повторите попытку.


0
2018-05-24 22:22