本文介绍如何使用 sudo 将输出重定向到当前用户没有权限的文件。
注意:本文中 demo 的演示环境为 ubuntu 18.04。

Permission denied 问题

如果当前用户没有某个文件的写权限,又要通过输出重定向往该文件中写入内容。结果只能是 "Permission denied"。比如当前用户为 nick,下面的命令视图查询 /root 目录下的文件并把结果写入到 /root/test.txt 文件中(注意:用户 nick 没有对 /root/test.txt 文件的写权限):

$ sudo ls -al /root/test.txt
$ sudo ls -al /root > /root/test.txt

Permission denied 的原因

sudo ls -al /root > /root/test.txt 命令不工作的原因是:
虽然 ls 命令是以 sudo 方式执行的,但是输出重定向操作是由当前 shell 执行的,它(当前 shell)没有 /root/test.txt 文件的权限,所以最终失败。

搞清楚了原因,就可以通过不同的方式来解决这个问题了,下面介绍四种方式。

以 sudo 方式运行 shell

既然是 shell 进程没有权限,那就用 sudo 的方式执行 shell:

$ sudo bash -c 'ls -al /root > /root/test.txt'

把命令写入脚本,以 sudo 方式执行脚本

把下面的代码保存到脚本文件 test.sh 中:

#!/bin/bash
ls -al /root > /root/test.txt

然后通过下面的方式执行:

$ chmod +x test.sh
$ sudo ./test.sh

如果觉着创建脚本麻烦的话还可以使用变通的方式:

$ sudo bash <<EOF
> ls -al /root > /root/test.txt
> EOF

或者是下面的写法:

$ echo 'ls -al /root > /root/test.txt' | sudo bash

先通过 sudo -s 启动 shell,然后执行命令

先通过 sudo -s 命令切换到 root 用户再执行命令,最后 ctrl + d 退出:

通过 sudo tee 命令实现

Tee 命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的 stdin。简单的说就是把数据重定向到给定文件和屏幕上(下图来自互联网):

下面的命令中通过 sudo tee 把 ls 命令的输出写入文件:

$ sudo ls -al /root | sudo tee /root/test.txt > /dev/null

其中的 > /dev/null 阻止 tee 把内容输出到终端:

参考:
linux – 如何使用sudo将输出重定向到一个我没有权限写入的位置?

sudo 与输出重定向的更多相关文章

  1. 红帽学习笔记[RHCSA] 第三课[输出重定向、Vi编辑器]

    第三课 关于Linux的输入输出 输入输出 0 stdin 标准输入 仅读取 1 stdout 标准输出 仅写入 2 stderr 标准错误 仅写入 3 filename 其他文件 读取和/或写入 输 ...

  2. linux进程后台运行及输出重定向

    本机环境为ubuntu 14.04 以ping www.baidu.com为例: 1.程序的前台运行 ping www.baidu.com 可以看到,屏幕上输出了baidu返回的结果 2.实现程序后台 ...

  3. unix下输出重定向

    > 为重定向符号 >> 重定向不覆盖原文件内容 example: 1. 标准输出重定向 echo "123" > /home/123.txt ---- 标准 ...

  4. [转]linux shell数据重定向(输入重定向与输出重定向)详细分析

      在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件 ...

  5. linux | 管道符、输出重定向

    1 输出重定向 ll > a.txt 将 ll的结果写入到a.txt 2 管道符 ls -la | grep h* 这条命令的理解为:ls -la 的结果作为gerp h* 的结果 gerp 是 ...

  6. python输出重定向

    0表示标准输入1表示标准输出2表示标准错误输出> 默认为标准输出重定向,与 1> 相同2>&1 意思是把 标准错误输出 重定向到 标准输出.&>file 意思是 ...

  7. 学习笔记之Shell脚本的输出重定向

    shell http://baike.baidu.com/link?url=qN3THt5ZJhQtwRJJkakWdz5-vZp4V9H3OmNP97XNhaoL-dqU-6rrFrYfHXmYv6 ...

  8. Linux实时将所有输出重定向到文件

    Linux的重定向机制十分好用,我们经常需要在服务器上挂起一个服务程序,然后将该程序的所有输出重定向到某个文件,这样即使我们注销了用户,程序依然在linux服务器上运行着. 但是重定向的输出经常无法实 ...

  9. 禁止输出重定向(>)覆盖已存在文件(防止误操作)

    在输出重定向中,>表示重定向并覆盖已有文件内容,为了防止误操作,覆盖重要的内容,可以使用如下命令: set -C 这样输出重定向到一个已有文件就会提示: cannot overwrite exi ...

随机推荐

  1. 对Spring的理解(简单)!

    1.Spring是对j2EE诸多功能进行封装了的一个工具集:它的核心就是提供了一种新的机制来管理业务对象及依赖关系:具体就是控制反转.依赖注入,Aop(面向切面). Spring的底层实现机制是用De ...

  2. 微信小程序搭建和开发相关指引

    几点: 1.环境搭建 2.开发和调试 3.发布 原文链接: http://www.lookdaima.com/WebForms/WebPages/Blanks/Pm/Docs/DocItemDetai ...

  3. 使用zip压缩文件夹方法

    最近使用MapGis对.MPJ工程文件文件裁剪后,要对裁剪后的图形文件.ML,.MT,.MP,.MPJ文件打包,在网上找到7zip,Zlib的库,虽然都有源码,但是Zlib库中的使用没找到文件压缩的函 ...

  4. 最大公约数&&最小公倍数

    //最大公约数(greatest common divisor),运用递归 int gcd(int a,int b){//注意a要求大于b return !b?a:gcd(b,a%b); } //最小 ...

  5. 学习CGLIB与JDK动态代理的区别

    动态代理 代理模式是Java中常见的一种模式.代理又分为静态代理和动态代理.静态代理就是显式指定的代理,静态代理的优点是由程序员自行指定代理类并进行编译和运行,缺点是一个代理类只能对一个接口的实现类进 ...

  6. tkinter学习系列(二)之窗口的设置

    目录 (一)窗体的最小框架 1.说明: 2.源代码: 3.实现效果: (二)窗体的基本设置 1.说明: 2.完整代码: 3.实现效果: (三)窗体的外形设置 1.说明: 2.完整代码: 3.实现效果: ...

  7. C++基础算法学习——逆波兰表达式问题

    例题:逆波兰表达式逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 ...

  8. TGJSBridge使用

    .在ViewController.h中 #import <UIKit/UIKit.h> #import "TGJSBridge.h" @interface BaseVi ...

  9. P1141 01迷宫 dfs连通块

    题目描述 有一个仅由数字000与111组成的n×nn \times nn×n格迷宫.若你位于一格0上,那么你可以移动到相邻444格中的某一格111上,同样若你位于一格1上,那么你可以移动到相邻444格 ...

  10. C#从入门到精通视频教程(2009年最新)- 视频列表

    http://www.jz97.net/index.php/playlist/view/182/page/2 C#从入门到精通视频教程(2009年最新)- 视频列表