如何从命令行将文本追加到/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

如何避免此错误?


您需要提及两件事:1)您是否在sudoers列表中,并且设置正确吗?2)您的/etc/apt/sources.list文件具有哪些权限?
sykora

Answers:


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

三通命令被称为通过超级用户须藤-a参数告诉发球附加到文件,而不是覆盖它。

您的原始命令失败,因为使用>>的IO重定向将以常规用户的身份完成,只有sudo执行了回显。

像这样调用sudo子外壳

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

也可以像其他人指出的那样工作。


感谢您的回答-供将来参考,请问这属于哪里?或者您是说它根本不属于本网站?
马修

1
@Matthew因为它与编程无关,所以一旦对所有人开放,它可能更适合serverfault.com。目前,它的唯一的测试版(serverfault.com/beta-access
洛萨

5
我发现这对于作为程序员安装一些依赖项很有用。我绝对认为这应该在StackOverflow上。
wwwilliam 2011年

另请参见类似问题的答案(使用sed):在不使用io重定向的情况下从命令行将文本追加到文件中
Thomas

在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
Dennis

9

在启动命令之前,shell会自行处理“>”,“ <”,“ >>”等。因此,问题在于“ sudo >> / etc / foo”在获得特权之前尝试打开/ etc / foo进行添加。

一种解决方法是使用sudo启动另一个shell来执行您想要的操作,例如:

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

或者:

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

一种更简单的方法可能只是使用sudo在/ etc / file上启动编辑器:)


8

最好在使用一个单独的文件/etc/apt/sources.list.d在此说明对方的回答

请注意,文件名必须以.list结尾,否则将被忽略。


您的评论应该是答案的一部分,所以我建议您编辑后者。
tzot 2011年

3

解决此问题的一种方法是在子shell中进行重定向:

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 2014年

而且现在似乎可以在基于Debian的系统中使用,因此可能是正确的方法。
Wilf 2014年

0

这是不使用管道的解决方案,只需简单的就地编辑即可:

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

ex相当于vi -e


0

如果您以su身份登录(如果您有特权),则相同的命令也可以正常工作...

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

如果您不是超级用户,请遵循Lothar的答案。

如果以这种方式执行此操作,请确保从su退出,这样您就不会以root(超级用户)身份运行不必要的程序。


1
这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方发表评论。
所有工人都很重要

我试图改善答案,但不确定如何无法提供答案。进一步了解您为何得出此结论将很有帮助
Shapeshifter 2015年

您的回答只是对我的评论,而不是回答问题,因为您的问题基本上只是说要使用Lothar的回答,并且如果OP已经是超级用户,他们就不会遇到此问题(对I / O的sudo的误解重定向)。
所有工人都是必不可少的

我明白您的意思,但是我的回答只是说明OP可以以超级用户的身份运行该命令,而不是使用sudo,它将起作用。
Shapeshifter

-1

首先通过以下命令打开或创建要编辑的文件

1- sudo nano文件名

2-打开后编辑文件

3- Ctrl + x

4-按'Y'说是

到此为止。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.