我想做:

echo "something" >> /etc/config_file

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

sudo echo "something" >> /etc/config_file


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

评论

我正在使用Ubuntu 9.04,并且能够对到目前为止需要的每个命令使用sudo。生成一个子外壳是可行的。

密切相关:将stdout重定向到您没有write(在Unix和Linux上)具有写许可权的文件。弱相关:具有目录路径的ls显示文件,但是具有文件模式的ls不显示文件?

#1 楼

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的操作
只有具有高级权限的“写入文件”部分才能运行
复杂的命令要容易得多


评论


在OS X上,Tee似乎只有-a标志。

– Lri
2012年6月20日14:48

Debian 8 tee具有-a append标志。

–粘土
17年3月13日在18:46

使用echo“输出” | sudo tee -a文件> / dev / null如果要跳过控制台输出。

– Moshe Bixenshpaner
17/09/22在1:16



对于WSL也很好。

–kayleeFrye_onDeck
17年12月8日,0:18

如果“某物”是某个秘密值,而又不想输出到终端并可能保存在日志中,该怎么办?

–quapka
20年8月11日在14:45



#2 楼

重定向在当前shell中执行。为了使用提升的特权进行重定向,必须使用提升的特权运行shell本身:

sudo bash -c "somecommand >> somefile"


#3 楼

让sudo生成一个子shell:

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


在此示例中,sudo以其他字符作为参数运行“ sh”。在sudo手册页中显示为示例)

评论


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

–兰迪·奥里森
09-10-13在14:48

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

– TOOGAM
16年6月16日在17:42

#4 楼

我通常将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


#5 楼

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

sudo dd of=/etc/profile <<< END
JAVA_HOME=/usr/lib/jvm/java-6-sun
END


#6 楼

此处的sudo和重定向可能存在问题。使用您选择的文本编辑器代替添加行。

评论


不幸的是,这产生了相同的结果。

–马特·诺里斯(Matt Norris)
09-10-13在14:57

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

–嘎嘎吉qua德
09-10-13在15:55

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

–Ernie Dunbar
18年5月9日在16:02

#7 楼

这非常简单,通常将sudo放在首位。

sudo sed -i '$a something' /etc/config_file


$a表示要在文件末尾附加。

#8 楼

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

#9 楼

使用ex-way:

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


并将FOO替换为变量以附加。

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