如何附加到文件作为sudo?

age*_*ser 304 linux sudo command-line

我想要做:

echo "something" >> /etc/config_file

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

sudo echo "something" >> /etc/config_file
Run Code Online (Sandbox Code Playgroud)

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

aki*_*ira 425

使用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
[...]
Run Code Online (Sandbox Code Playgroud)

所以你的命令变成

echo "something" | sudo tee -a /etc/config_file
Run Code Online (Sandbox Code Playgroud)

tee使用管理权限执行 Bash的优点是

  • 您没有以管理权限执行 Bash
  • 只有“写入文件”部分以高级权限运行
  • 引用复杂的命令要容易得多

  • 使用`echo "输出" | sudo tee -a file > /dev/null` 如果你想跳过控制台输出。 (15认同)
  • 在 OS X tee 上似乎只有一个 -a 标志。 (2认同)

Ign*_*ams 58

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

sudo bash -c "somecommand >> somefile"
Run Code Online (Sandbox Code Playgroud)


Dou*_*ris 27

让 sudo 产生一个子外壳:

sudo sh -c "echo 'JAVA_HOME=/usr/lib/jvm/java-6-sun' >> /etc/profile"
Run Code Online (Sandbox Code Playgroud)

在这个例子中,sudo 运行“sh”,其余的作为参数。

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

  • 原因是执行重定向的是您的 shell(以您的身份运行),而不是 sudo。由于您无权写入文件,因此您会收到 Permission denied 错误。这个答案的作用是启动一个以 root 身份运行的新 shell,因此能够写入文件。 (8认同)

小智 8

我通常使用带有sudo tee -a 的shell HERE 文档。类似的东西:

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
Run Code Online (Sandbox Code Playgroud)


小智 6

在我看来,在这种情况下最好的是 dd:

sudo dd of=/etc/profile <<< END
JAVA_HOME=/usr/lib/jvm/java-6-sun
END
Run Code Online (Sandbox Code Playgroud)