sudo echo“something”>> / etc / privilegedFile不起作用…有没有其他的select?
这是一个非常简单的问题,至less它应该是这样的,关于Linux中的sudo权限。
有很多时候,我只是想附加一些东西到/etc/hosts
或类似的文件,但最终不能够,因为>
和>>
都不允许,即使有根。
有没有办法使这个工作,而不必su
或sudo 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
像这样的东西适合你?