sudo echo“something”>> / etc / privilegedFile不起作用…有没有其他的select?

这是一个非常简单的问题,至less它应该是这样的,关于Linux中的sudo权限。

有很多时候,我只是想附加一些东西到/etc/hosts或类似的文件,但最终不能够,因为>>>都不允许,即使有根。

有没有办法使这个工作,而不必susudo su到根?

使用tee:

 echo 'deb blah ... blah' | sudo tee --append /etc/apt/sources.list 

确保避免引号内引号。

要避免将数据打印回控制台:

 echo 'deb blah ... blah' | sudo tee --append /etc/apt/sources.list > /dev/null 

问题是shell不会输出redirect,而不是sudo或echo,所以这是以普通用户的身份完成的。

尝试下面的代码片段:

 sudo sh -c "echo 'something' >> /etc/privilegedfile" 

问题是这是你的shell处理redirect; 它试图用你的权限打开文件,而不是你在sudo下运行的进程的权限。

使用这样的东西,也许:

 sudo sh -c "echo 'something' >> /etc/privilegedFile" 
 sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts" 

 sudo sh -c "echo >> somefile" 

应该工作。 问题是>和>>是由你的shell来处理的,而不是由“sudoed”命令来处理的,所以权限是你的,而不是你正在“sudoing”的那个用户。

我会注意到,好奇的是,你也可以引用heredoc(对于大块):

 sudo bash -c "cat <<EOIPFW >> /etc/ipfw.conf <?xml version=\"1.0\" encoding=\"UTF-8\"?> <plist version=\"1.0\"> <dict> <key>Label</key> <string>com.company.ipfw</string> <key>Program</key> <string>/sbin/ipfw</string> <key>ProgramArguments</key> <array> <string>/sbin/ipfw</string> <string>-q</string> <string>/etc/ipfw.conf</string> </array> <key>RunAtLoad</key> <true></true> </dict> </plist> EOIPFW" 

在bash中,你可以结合使用tee> /dev/null来保持stdout的清洁。

  echo "# comment" | sudo tee -a /etc/hosts > /dev/null 

使用Yoo的答案 ,把它放在~/.bashrc

 sudoe() { [[ "$#" -ne 2 ]] && echo "Usage: sudoe <text> <file>" && return 1 echo "$1" | sudo tee --append "$2" > /dev/null } 

现在你可以运行sudoe 'deb blah # blah' /etc/apt/sources.list


编辑:

一个更完整的版本,它允许你pipe道input或从文件redirect,并包括一个-a开关来closures追加(默认情况下是开启的):

 sudoe() { if ([[ "$1" == "-a" ]] || [[ "$1" == "--no-append" ]]); then shift &>/dev/null || local failed=1 else local append="--append" fi while [[ $failed -ne 1 ]]; do if [[ -t 0 ]]; then text="$1"; shift &>/dev/null || break else text="$(cat <&0)" fi [[ -z "$1" ]] && break echo "$text" | sudo tee $append "$1" >/dev/null; return $? done echo "Usage: $0 [-a|--no-append] [text] <file>"; return 1 } 

这工作对我来说:原始命令

 echo "export CATALINA_HOME="/opt/tomcat9"" >> /etc/environment 

工作命令

 echo "export CATALINA_HOME="/opt/tomcat9"" |sudo tee /etc/environment 

你可以改变文件的所有权,然后使用cat >>追加后改回来?

 sudo chown youruser /etc/hosts sudo cat /downloaded/hostsadditions >> /etc/hosts sudo chown root /etc/hosts 

像这样的东西适合你?