sudo 与输出重定向

Posted sparkdev

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sudo 与输出重定向相关的知识,希望对你有一定的参考价值。

本文介绍如何使用 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 与输出重定向的主要内容,如果未能解决你的问题,请参考以下文章

将 sed 的输出重定向到文件时,sudo 不起作用[重复]

将输出重定向为不同的用户[重复]

kermit - 如何将输出重定向到文件中

Linux重定向与管道简述

数据流重定向与管道命令

(转)linux sudo 重定向,实现只有系统管理员才有权限操作的文件中写入信息