如何以sudo形式附加到文件?


271

我想要做:

echo "something" >> /etc/config_file

但是,由于只有root用户才对该文件具有写权限,所以我不能这样做。但是以下内容也不起作用。

sudo echo "something" >> /etc/config_file

在这种情况下,是否有一种方法可以附加到文件,而不必先使用sudo'd编辑器打开它,然后手动附加新内容?


我使用的是Ubuntu 9.04,到目前为止我需要的每个命令都可以使用sudo。生成一个子外壳是可行的。
马特·诺里斯

Answers:


390

使用tee -a(或tee --append)与sudo

tee - read from standard input and write to standard output and files
[...]
   -a, --append
      append to the given FILEs, do not overwrite
[...]

所以你的命令变成

echo "something" | sudo tee -a /etc/config_file

tee与管理权限相比,执行Bash 的优势在于

  • 您不使用管理权限执行Bash
  • 只有“写入文件”部分具有高级权限才能运行
  • 报价复杂的命令要容易得多

2
在OS X上,Tee似乎只有-a标志。
Lri 2012年

Debian 8 tee具有-aappend标志。
黏土

9
使用echo "output" | sudo tee -a file > /dev/null,如果你想跳过控制台输出。
Moshe Bixenshpaner

对于WSL也很好。
kayleeFrye_onDeck


26

让sudo生成一个子shell:

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

在此示例中,sudo运行“ sh”,其余作为参数。

(这在sudo手册页中作为示例显示)


8
原因是进行重定向的是您的外壳程序(以您的身份运行),而不是sudo。由于您没有写该文件的权限,因此会出现“权限被拒绝”错误。这个答案的作用是启动一个新的外壳程序,该外壳程序以root身份运行,因此能够写入该文件。
兰迪·奥里森

这不是正确的答案。这是一个正确的答案。晃的答案更好,因为答案中提供了逻辑。
TOOGAM

6

我通常将shell HERE文档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

我认为,这种情况下最好的是dd:

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

不幸的是,这产生了相同的结果。
马特·诺里斯

1
su -c 'echo "JAVA_HOME=/usr/lib/jvm/java-6-sun" >> /etc/profile'应该管用。由于没有任何东西可以使shell错误地在arg中扩展以回显,因此请单引号将整个命令括起来。
2009年

这太妙了。现在,将其作为脚本的一部分进行。
埃妮·邓巴

0

您尝试重定向(使用>>)sudo的输出将无法正常工作。您真正想做的是重定向的输出echo。我建议您只使用自己喜欢的编辑器,然后将该行手动添加到中/etc/profile。这具有额外的好处,您可以检查是否/etc/profile已设置JAVA_HOME


0

使用三通:

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

并替换FOO为要附加的变量。

在某些系统(例如OS X)中,该/etc/profile文件具有444权限,因此,如果仍然拒绝权限,请首先检查并更正权限:

sudo chmod 644 /etc/profile

然后再试一次。

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.