【问题标题】:How can I append text to /etc/apt/sources.list from the command line?如何从命令行将文本附加到 /etc/apt/sources.list?
【发布时间】:2009-05-12 01:13:48
【问题描述】:

我是 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 文件的权限是什么?
  • 最好使用/etc/apt/sources.list.d中的单独文件,而不是修改/etc/apt/sources.list。见stackoverflow.com/questions/1584066/…

标签: bash


【解决方案1】:
echo "[some repository]" | sudo tee -a /etc/apt/sources.list

tee 命令通过 sudo 作为超级用户调用,-a 参数告诉 tee 追加到文件而不是覆盖它。

您的原始命令失败,因为使用 >> 的 IO 重定向将作为普通用户完成,只有您的 echo 是使用 sudo 执行的。

调用 sudo subshel​​l 之类的

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

正如其他人所指出的那样,也有效。

【讨论】:

  • 感谢您的回答 - 以供将来参考,这属于哪里?或者你的意思是它根本不属于这个网站?
  • @Matthew 因为它与编程无关,一旦它对所有人开放,它可能更适合 serverfault.com。目前它只是测试版 (serverfault.com/beta-access)
  • 我发现这对于安装一些依赖项的程序员很有用;我绝对认为这应该在 StackOverflow 上。
  • 另请参阅类似问题的答案(使用 sed):Append text to file from command line without using io redirection
  • 在 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
【解决方案2】:

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 上启动编辑器 :)

【讨论】:

    【解决方案3】:

    最好在/etc/apt/sources.list.d 中使用单独的文件,而不是修改/etc/apt/sources.list,如other answer 中所述。 (请注意,文件名必须以.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
    

    请注意,tee 命令上不需要-a(因为您没有追加)。

    您也可以在其他地方创建文件,然后将其复制到位:

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

    【讨论】:

    • 你的评论应该是你答案的一部分,所以我建议你编辑后者。
    【解决方案4】:

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

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

    这样,sh 进程在sudo 下执行,因此具有打开重定向输出到/etc/apt/sources.list 的必要权限。

    【讨论】:

      【解决方案5】:

      以下作品适合我

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

      【讨论】:

        【解决方案6】:

        在 Karmic 中,您可以只使用 add-apt-repository 命令,至少对于 PPA。

        例如:

        sudo add-apt-repository ppa:docky
        

        【讨论】:

        • add-apt-repository 不在基础中,要让它运行:apt-get install software-properties-common
        • 现在似乎可以在基于 Debian 的系统中使用,所以可能是正确的方法。
        【解决方案7】:

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

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

        ex 等价于vi -e

        【讨论】:

          【解决方案8】:

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

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

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

          如果你这样做,一定要从 su 中退出,这样你就不会以 root(超级用户)身份运行不必要的程序

          【讨论】:

          • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
          • 我试图改善答案,但不确定它如何无法提供答案。了解更多关于您为何得出此结论的信息会很有帮助
          • 您的回答只是对我的评论,而不是回答问题,因为您的问题基本上只是说使用 Lothar 的回答,如果 OP 已经是超级用户,他们就不会遇到这个问题(对 sudo 与 I/O 重定向的误解)。
          • 我明白你的意思,但我的回答只是说明 OP 可以以超级用户身份运行该命令,而不是使用 sudo,它会起作用。
          【解决方案9】:

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

          1- sudo nano 文件名

          2- 打开后编辑文件

          3- ctrl+x

          4- 按“Y”表示同意

          你就完成了。

          【讨论】:

            【解决方案10】:

            有趣,1- 使用 rm 删除文件,2 使用 touch 再次创建文件,3 使用 printf 打印格式化,4 使用 tee 管道到文件(这是为 DEBIAN)替换为您的口味和喜欢

            sudo rm /etc/apt/sources.list && sudo touch /etc/apt/sources.list && sudo chmod +rwx /etc/apt/sources.list && sudo printf "deb http://deb.debian.org/debian buster main contrib non-free
            deb-src http://deb.debian.org/debian buster main contrib non-free
            deb http://deb.debian.org/debian-security/ buster/updates main contrib non-free
            deb-src http://deb.debian.org/debian-security/ buster/updates main contrib non-free
            deb http://deb.debian.org/debian buster-updates main contrib non-free
            deb-src http://deb.debian.org/debian buster-updates main contrib non-free" | sudo tee -a /etc/apt/sources.list
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-06-08
              • 2015-02-01
              • 1970-01-01
              • 2012-01-05
              • 2017-05-15
              • 1970-01-01
              • 1970-01-01
              • 2014-04-15
              相关资源
              最近更新 更多