it-swarm.cn

sudo echo“something”>>/etc/privilegedFile不起作用

对于Linux中的Sudo权限,这是一个非常简单的问题,至少看起来应该是这样。

很多时候,我只想在/etc/hosts或类似的文件中添加一些内容,但最终无法进行,因为即使使用root也不允许使用>>>

有没有必要在没有suSudo su进入root的情况下完成这项工作?

527
David

使用tee --appendtee -a

echo 'deb blah ... blah' | Sudo tee -a /etc/apt/sources.list

请务必避免引号内的引号。

要避免将数据打印回控制台,请将输出重定向到/ dev/null。

echo 'deb blah ... blah' | Sudo tee -a /etc/apt/sources.list > /dev/null
758
Yoo

问题是Shell确实输出了重定向,而不是Sudo或echo,因此这是以普通用户身份完成的。

请尝试以下代码段:

Sudo sh -c "echo 'something' >> /etc/privilegedfile"
291
Matt P

问题是你的Shell是处理重定向的;它试图用 你的 权限打开文件,而不是你在Sudo下运行的进程。

使用这样的东西,也许:

Sudo sh -c "echo 'something' >> /etc/privilegedFile"
31
Incident
Sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"
17
Vinko Vrsalovic

Sudo sh -c "echo >> somefile"

应该管用。问题是>和>>由Shell处理,而不是由“sudoed”命令处理,因此权限是您的权限,而不是您正在“sudoing”的用户权限。

13
agnul

我会注意到,好奇的是,你也可以引用一个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"
9
msanford

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

 echo "# comment" |  Sudo tee -a /etc/hosts > /dev/null
8
Vytenis Bivainis

使用 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


编辑:

一个更完整的版本,允许您管道输入或从文件重定向,并包含-a开关以关闭附加(默认情况下打开):

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
}
4
hololeap

你也可以使用sponge包中的moreutils而不需要重定向输出(即没有tee噪声隐藏):

echo 'Add this line' | Sudo sponge -a privfile
2
Michael Goldshteyn

echo'Hello World'| (Sudo tee -a /etc/apt/sources.list)

0
Sudev Shetty