为 root 用户清空文件不起作用

Hus*_*oli 25 root sudo

我使用以下命令清空文件

> file.txt
Run Code Online (Sandbox Code Playgroud)

它工作得很好!但是有一些文件具有root用户权限。所以我试过了

sudo > different-file.txt
Run Code Online (Sandbox Code Playgroud)

我得到了以下详细信息

usage: sudo [-D level] -h | -K | -k | -V
usage: sudo -v [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-u user name|#uid]
usage: sudo -l[l] [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-U user name] [-u user name|#uid] [-g groupname|#gid] [command]
usage: sudo [-AbEHknPS] [-C fd] [-D level] [-g groupname|#gid] [-p prompt] [-u user name|#uid] [-g groupname|#gid] [VAR=value] [-i|-s]
        [<command>]
usage: sudo -e [-AknS] [-C fd] [-D level] [-g groupname|#gid] [-p prompt] [-u user name|#uid] file ...
Run Code Online (Sandbox Code Playgroud)

这表明我的命令中存在一些语法错误。

怎么了?

ter*_*don 42

要以 root 身份清空文件,您还可以使用以下truncate命令:

$ sudo truncate -s0 file.txt
Run Code Online (Sandbox Code Playgroud)

-s0设置文件的大小为0,有效地排空。


Baa*_*rud 9

使用sudo -i成为根(带根壳),而不是第一个。

sudo用于以root身份运行命令,但>不是命令,而是 shell 内的重定向 - 两者都不是由 root 运行的。

说你跑sudo cat foo > bar...

cat以 root 身份运行,并且可以访问和执行任何操作 - 包括打开“foo”,即使它由其他用户拥有并且关闭了所有读取权限。

但是>shell 的 一部分在其中sudo cat运行,并以您(非 root 用户)和您的正常权限运行。并且文件“bar”也以您的普通(非 root)用户身份(由 shell)访问,因此您的普通用户必须 1) 具有对该目录的写入权限或 2) 拥有该文件。如果目录或文件由另一个用户(包括 root 用户)拥有,您将无法访问它。


Ram*_*esh 6

我创建了一个名为的新文件new,现在由 root 用户拥有,如下所示。

ls -lat new
-rw-r--r-- 1 root root 42 Sep  9 13:37 new
Run Code Online (Sandbox Code Playgroud)

现在,我以普通用户身份登录,然后尝试使用以下命令擦除该文件的内容。

sudo sh -c " > /root/new"
Run Code Online (Sandbox Code Playgroud)

现在,我可以通过再次以 root 身份登录来验证内容是否已被删除。

ls -lat new
-rw-r--r-- 1 root root 0 Sep  9 13:42 new
Run Code Online (Sandbox Code Playgroud)

参考

这个答案有以下几点。

或者,您可以运行 sudo sh -c "echo 'text' >> /file.txt",它也可以工作,但是如果您有复杂的表达式,所有插值/转义都会造成干扰,这有点麻烦。

但是,由于您只是清空文件,我相信您的情况不应该有任何并发​​症。


Vol*_*gel 5

获取sudo和重定向一起工作既困难又令人困惑,但有一个更明确的选择:

printf '' | sudo tee file.txt
Run Code Online (Sandbox Code Playgroud)

没有什么特别的,实际上:

  • tee默认情况下不带-a选项截断输出文件。
  • 它将来自 stdin 的输入写入文件。
  • 输入是空字符串,因此文件为空。
  • tee 将输入的副本写入输出,但输入为空。