Як я можу додати текст до /etc/apt/sources.list із командного рядка?


75

Я новачок у Linux, і я тільки починаю вчитися bash. Я використовую Ubuntu 9.04 і хочу додати сховища до /etc/apt/sources.list із командного рядка. В основному, я хотів би зробити це:

sudo echo "[some repository]" >> /etc/apt/sources.list

Однак навіть коли я використовую sudo, я отримую таку помилку:

bash: /etc/apt/sources.list: Permission denied

Як мені уникнути цієї помилки?


Потрібно згадати 2 речі: 1) Ви перебуваєте у списку судореїв і чи правильно це встановлено? 2) Які дозволи має ваш файл /etc/apt/sources.list?
sykora

Краще використовувати окремий файл, /etc/apt/sources.list.dа не модифікувати /etc/apt/sources.list. Дивіться stackoverflow.com/questions/1584066/…
Ніл Мейхью,

Відповіді:


140
echo "[some repository]" | sudo tee -a /etc/apt/sources.list

Команда tee викликається суперкористувачем через sudo, а аргумент -a вказує tee, щоб він додався до файлу, а не перезаписував його.

Помилка вашої початкової команди, оскільки перенаправлення вводу-виводу за допомогою >> буде виконуватися як звичайний користувач, лише ваше відлуння було виконано за допомогою sudo.

Виклик під оболонки sudo типу

sudo sh -c 'echo "[some repository]" >> /etc/apt/sources.list'

твори, як зазначили інші.


Дякуємо за вашу відповідь - для подальшого довідкового запитання, куди б це потрапило? Або ви маєте на увазі, що воно взагалі не на цьому сайті?
Метью

1
@Matthew Оскільки це насправді не пов'язано з програмуванням, можливо, це було б краще для розміщення на serverfault.com, як тільки він буде відкритий для всіх. Наразі це лише бета-версія ( serverfault.com/beta-access )
lothar

5
Я знайшов це корисним як програміст, який встановлює деякі залежності; Я точно вважаю, що це має бути на StackOverflow.
wwwilliam

див. також цю відповідь на подібне запитання (за допомогою sed): Додайте текст до файлу з командного рядка без використання перенаправлення io
Томас

Здається, у вас є проблема при спробі на Amazon VPC / EC2. Ось що я отримую: echo "deb deb.theforeman.org trusty 1.7" | sudo tee -a /etc/apt/sources.list.d/foreman.list sudo: неможливо вирішити хост ip-10-0-0-91 deb deb.theforeman.org Trusty 1.7
Денніс

9

Оболонка обробляє ">", "<", ">>" тощо перед запуском команд. Отже, проблема в тому, що "sudo >> / etc / foo" намагається відкрити / etc / foo для append перед тим, як отримати привілеї.

Одним із шляхів цього є використання sudo для запуску іншої оболонки, щоб робити те, що ви хочете, наприклад:

sudo sh -c 'echo "[some repository]" >> /etc/apt/sources.list'

Або як варіант:

echo "[some repository]" | sudo sh -c 'cat >> /etc/apt/sources.list'

Більш простим підходом може бути просто використання sudo для запуску редактора у файлі / etc / :)


9

Краще використовувати окремий файл, /etc/apt/sources.list.dа не модифікувати /etc/apt/sources.list, як пояснюється в цій іншій відповіді . (Зверніть увагу, що ім’я файлу ПОВИННО закінчуватися на, .listабо воно буде проігноровано.)

Однак якщо ви хочете створити його, використовуючи echoпроблему з дозволами, залишається. Ви можете використати teeдля його створення так:

echo '[some repository]' | sudo tee /etc/apt/sources.list.d/some-repository.list >/dev/null

або ось так:

sudo tee /etc/apt/sources.list.d/some-repository.list >/dev/null <<EOF
[some repository]
EOF

Зверніть увагу , що вам не потрібно -aна teeкоманду (тому що ви не додаючи).

Ви також можете створити файл де-небудь ще, а потім скопіювати його на місце за допомогою:

sudo cp path/to/some-repository.list /etc/apt/sources.list.d/

Ваш коментар повинен бути частиною вашої відповіді, тому я пропоную вам відредагувати останній.
tzot

3

Один із способів вирішити це - зробити переспрямування в підшелутці:

sudo sh -c 'echo "[some repository]" >> /etc/apt/sources.list'

Таким чином, shпроцес виконується під sudoі, отже, має необхідні привілеї, щоб відкрити перенаправлений вихід /etc/apt/sources.list.


3

Наступні роботи для мене

sudo echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" | sudo tee -a /etc/apt/sources.list.d/10gen.list

1

У Karmic ви можете просто використовувати add-apt-repositoryкоманду, принаймні для PPA.

Наприклад:

sudo add-apt-repository ppa:docky

add-apt-repository не в базі, для його запуску:apt-get install software-properties-common
notpeter

І, схоже, зараз він доступний у системах на основі Debian, тому, мабуть, це правильний спосіб це зробити.
Вільф

0

Ось рішення без використання трубопроводів, просто просте редагування на місці:

sudo ex +'$put = \"[some repository]\"' -cwq /etc/apt/sources.list

Це exеквівалентно vi -e.


0

Якщо ви повинні були увійти як su (якщо у вас є привілеї), та сама команда буде працювати чудово ...

su
echo "[some repository]" >> /etc/apt/sources.list

Якщо ви не суперкористувач, тоді спробуйте відповідь Лотара.

Якщо ви робите це таким чином, не забудьте вийти з su, щоб не запускати непотрібні програми як root (суперкористувач)


1
Це не дає відповіді на запитання. Щоб критикувати або вимагати роз’яснень від автора, залиште коментар під його публікацією.
Усі робітники є основними

Я намагався покращити відповідь, не знаючи, як це не дає відповіді. Було б корисно дізнатись більше, чому ви дійшли такого висновку
Shapeshifter

Ваша відповідь читалася мені лише як коментар замість відповіді на запитання, тому що у вашому питанні в основному було сказано, використовуйте відповідь Лотара, і якби ОП вже був суперкористувачем, вони б не зіткнулися з цією проблемою (нерозуміння sudo з I / O переспрямування).
Усі робітники є основними

Я бачу вашу думку, проте моя відповідь полягає лише в тому, що OP може запустити цю команду як суперкористувач, замість використання sudo, і це буде працювати.
Shapeshifter

-2

спочатку відкрийте або створіть файл, який ви хочете відредагувати, за допомогою наступної команди

1- ім'я файлу sudo nano

2- відредагуйте файл після його відкриття

3- ctrl + x

4- натисніть "Y", щоб сказати "так"

і готово.

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