как добавить в файл как sudo?

<p>я хочу делать:</p><p><code>echo "something" >> /etc/config\_file</code></p><p>но, поскольку только пользователь root имеет право на запись в этот файл, я не могу этого сделать. но следующее также не работает.</p><pre><code>sudo echo "something" >> /etc/config\_file </code></pre><p>есть ли способ добавить файл в такой ситуации, не открывая его с помощью редактора <code>sudo</code> d, а затем добавляя новый контент вручную?</p>

<p>правильный инструмент для правильной задачи: ' <a href="http://unixhelp.ed.ac.uk/cgi/man-cgi?tee">tee</a> '</p><pre><code>tee - read from standard input and write to standard output and files </code></pre><p>таким образом, ваша командная строка становится</p><pre><code>% echo "output" | sudo tee -a file </code></pre><p>преимущество <code>tee</code> перед выполнением bash с правами администратора:</p><ul> <li>вы не выполняете bash с правами администратора</li> <li>только часть «запись в файл» запускается с расширенными разрешениями</li> <li>цитирование сложной команды намного проще</li> </ul>

<p>перенаправление выполняется в текущей оболочке. чтобы выполнить перенаправление с повышенными привилегиями, необходимо запустить саму оболочку с повышенными привилегиями:</p><pre><code>sudo bash -c "somecommand >> somefile" </code></pre>

<p>у судо появляется суб-шелл:</p><pre><code>sudo sh -c "echo 'java\_home=/usr/lib/jvm/java-6-sun' >> /etc/profile" </code></pre><p>в этом примере sudo запускает «sh» с остальными в качестве аргументов.</p><p>(это показано в качестве примера на справочной странице sudo)</p>

<p>я обычно использую <a href="https://en.wikipedia.org/wiki/here\_document#unix\_shells">shell здесь документ</a> with<strong> sudo tee -a </strong>. что-то вроде:</p><pre><code>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 </code></pre>

<p>на мой взгляд, лучшим в этом случае является дд:</p><pre><code>sudo dd of=/etc/profile <<< end java\_home=/usr/lib/jvm/java-6-sun end </code></pre>

<p>здесь может быть проблема с sudo и перенаправлением. используйте текстовый редактор по вашему выбору, чтобы добавить строку.</p><pre><code>sudo nano /etc/profile </code></pre><p>или вы можете попробовать вместо этого su</p><pre><code>su echo ‘java\_home=/usr/lib/jvm/java-6-sun’ >> /etc/profile exit </code></pre>

<p>используйте <a href="https://en.wikipedia.org/wiki/ex\_(text\_editor)">ex</a> - путь:</p><pre><code>sudo ex +'$put =\"foo\"' -cwq /etc/profile </code></pre><p>и замените <code>foo</code> вашей переменной для добавления.</p><p>в некоторых системах (например, os x) файл <code>/etc/profile</code> имеет 444 разрешения, поэтому, если вы все еще получаете<em> разрешение отклонено </em>, сначала проверьте и исправьте разрешение:</p><pre><code>sudo chmod 644 /etc/profile </code></pre><p>затем попробуйте еще раз.</p>

<p>это не сработает, вы пытаетесь перенаправить (используя <code>>></code>) вывод sudo. что вы действительно хотите сделать, это перенаправить вывод <code>echo</code>. я предлагаю вам просто использовать ваш любимый редактор и добавить эту строку вручную в <code>/etc/profile</code>. это дает дополнительное преимущество: вы можете проверить, устанавливает ли <code>/etc/profile</code> уже <code>java\_home</code>.</p>