245

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

echo "something" >> /etc/config_file

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

sudo echo "something" >> /etc/config_file

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

8 ответов8

357

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

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

Таким образом, ваша командная строка становится

% echo "output" | sudo tee -a file

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

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

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

sudo bash -c "somecommand >> somefile"
25

Есть ли у sudo суб-оболочка:

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

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

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

6

Я обычно использую оболочку ЗДЕСЬ с документом 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

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

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
0

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

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

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

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

sudo chmod 644 /etc/profile

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .