彭某的技术折腾笔记

彭某的技术折腾笔记

Sudo Echo 重定向无权限解决方案

2024-05-13

Sudo Echo 重定向无权限解决方案

2024年5月13日

摘要

在 Linux 中,echo 命令常和重定向指令搭配用于将文本输入至文件,然而在输入至系统文件时,我们必须调用 sudo 来执行,此时就会报错。本文将会介绍此问题的原因和解决方案。

问题

举个例子,假如 ~/temp.txt 是一个当前用户所有的文件,则:

echo "Some Text to Save." >> ~/temp.txt

可以将 Some Text to Save. 存入 ~/temp.txt

假如 /etc/temp.txt 是一个系统文件,或是 root 所有的文件,我们理所应当的加上 sudo 执行命令:

sudo echo "Some Text to Save." >> /etc/temp.txt

然而此时,即使加上了 sudo,我们依然会得到一个 Permission Denied 的报错。

原因

在 Shell 中,重定向指令是 Shell 负责执行的,格式为 [COMMAND] [REDIRECTION],因此,sudo 其实是属于 [COMMAND] 这个部分,输出结果才会递交给 Shell,此时 Shell 才会将输出重定向至指定位置。

由于 Shell 本身是当前用户打开的,因此其重定向过程中所能获得的权限还是从当前用户继承,无法输出至自己并没有所有权的文件。

解决方案

一般情况下,有两种常见的解决方案。

使用 tee 命令

tee 命令可以将输入的内容复制成两份,一份输出给指定文件,一份输出给 STDOUT,因此,我们可以使用以下命令完成:

echo "Some Text to Save." | sudo tee -a /etc/temp.txt > /dev/null

此处,-a 选项是为了使用 append 模式,否则此文件会被清空覆盖。> /dev/null 是为了将 tee 命令的标准输出隐藏,否则 Console 中还会显示一遍此字符串。

使用子 Shell

我们可以使用 sudo 唤起一个 root 权限的 Shell 来执行原本的命令:

sudo zsh -c 'echo "Some Text to Save." >> /etc/temp.txt'
  • 0