本文介绍如何使用 sudo 将输出重定向到当前用户没有权限的文件。
注意:本文中 demo 的演示环境为 ubuntu 18.04。html
若是当前用户没有某个文件的写权限,又要经过输出重定向往该文件中写入内容。结果只能是 "Permission denied"。好比当前用户为 nick,下面的命令视图查询 /root 目录下的文件并把结果写入到 /root/test.txt 文件中(注意:用户 nick 没有对 /root/test.txt 文件的写权限):linux
$ sudo ls -al /root/test.txt $ sudo ls -al /root > /root/test.txt
sudo ls -al /root > /root/test.txt 命令不工做的缘由是:
虽然 ls 命令是以 sudo 方式执行的,可是输出重定向操做是由当前 shell 执行的,它(当前 shell)没有 /root/test.txt 文件的权限,因此最终失败。shell
搞清楚了缘由,就能够经过不一样的方式来解决这个问题了,下面介绍四种方式。ubuntu
既然是 shell 进程没有权限,那就用 sudo 的方式执行 shell:bash
$ sudo bash -c 'ls -al /root > /root/test.txt'
把下面的代码保存到脚本文件 test.sh 中:spa
#!/bin/bash ls -al /root > /root/test.txt
而后经过下面的方式执行:code
$ chmod +x test.sh $ sudo ./test.sh
若是觉着建立脚本麻烦的话还能够使用变通的方式:htm
$ sudo bash <<EOF > ls -al /root > /root/test.txt > EOF
或者是下面的写法:blog
$ echo 'ls -al /root > /root/test.txt' | sudo bash
先经过 sudo -s 命令切换到 root 用户再执行命令,最后 ctrl + d 退出:进程
Tee 命令用于将数据重定向到文件,另外一方面还能够提供一份重定向数据的副本做为后续命令的 stdin。简单的说就是把数据重定向到给定文件和屏幕上(下图来自互联网):
下面的命令中经过 sudo tee 把 ls 命令的输出写入文件:
$ sudo ls -al /root | sudo tee /root/test.txt > /dev/null
其中的 > /dev/null 阻止 tee 把内容输出到终端: