我使用以下命令清空文件
> 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,有效地排空。
使用sudo -i
成为根(带根壳),而不是第一个。
sudo
用于以root身份运行命令,但>
不是命令,而是 shell 内的重定向 - 两者都不是由 root 运行的。
说你跑sudo cat foo > bar
...
cat
以 root 身份运行,并且可以访问和执行任何操作 - 包括打开“foo”,即使它由其他用户拥有并且关闭了所有读取权限。
但是>
是shell 的 一部分在其中sudo cat
运行,并以您(非 root 用户)和您的正常权限运行。并且文件“bar”也以您的普通(非 root)用户身份(由 shell)访问,因此您的普通用户必须 1) 具有对该目录的写入权限或 2) 拥有该文件。如果目录或文件由另一个用户(包括 root 用户)拥有,您将无法访问它。
我创建了一个名为的新文件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",它也可以工作,但是如果您有复杂的表达式,所有插值/转义都会造成干扰,这有点麻烦。
但是,由于您只是清空文件,我相信您的情况不应该有任何并发症。
获取sudo
和重定向一起工作既困难又令人困惑,但有一个更明确的选择:
printf '' | sudo tee file.txt
Run Code Online (Sandbox Code Playgroud)
没有什么特别的,实际上:
tee
默认情况下不带-a
选项截断输出文件。 tee
将输入的副本写入输出,但输入为空。 归档时间: |
|
查看次数: |
10171 次 |
最近记录: |