如何通过 sudo 使用输出重定向? [复制]

Posted

技术标签:

【中文标题】如何通过 sudo 使用输出重定向? [复制]【英文标题】:How to use output redirection with sudo? [duplicate] 【发布时间】:2016-12-28 09:56:10 【问题描述】:

我希望将文本从标准输入写入 root 拥有的文件。

我通过 SSH 连接以编程方式执行此操作 - 主要来自脚本 - 所以使用文本编辑器是不可能的。没有终端。该过程是完全自动化的。

鉴于 [a] 根高度可以通过 sudo 获得,并且 [b] 文件可以使用带有重定向的 cat 写入,我假设以下方法可行:

ssh user@host sudo cat >the-file

不幸的是,重定向被应用到sudo,而不是cat。在此示例中,如何将重定向应用到 cat

【问题讨论】:

事实上,您甚至可以通过 SSH 连接使用文本编辑器,vim 或 nano 之类的编辑器应该可以正常工作。尝试使用 SSH 连接更好地解释您的情况。您尝试重定向时已经登录? 您的 sudo 命令似乎不正确。应该是sudo -u user -h host cat > the-file。这适用于我的系统。 “我通过 SSH 连接执行此操作,因此使用文本编辑器是不可能的”。这个结论并不像你做出的那样不言自明。 vimnano 甚至 emacs -nw 等编辑器在终端中工作得很好。 @John1024 是的,我可以使用 tee,但我宁愿直接解决重定向问题。 @paulequilibrio 我正在以编程方式调用该命令。我可以发出命令,但我没有终端。 @kaylum 如果-h 是所有平台上sudo 的标准参数,那就太好了。例如,在 Mac 上,没有这样的选项。你是对的,我的命令是错误的:我已经编辑了问题来修复它。 【参考方案1】:

执行此操作的正常模式是:

ssh user@host 'cat | sudo tee the-file'

tee 将输出重定向到一个文件,并且可以使用sudo 运行。

如果您想模仿文件附加到的>>,请使用sudo tee -a

您还需要确保如上所述引用您的命令,以便本地 shell 不会解释管道。

编辑

tee 命令is part of POSIX,所以你可以依赖它存在。

也重定向标准错误:

ssh user@host 'some_command 2>&1 | sudo tee output-file'

【讨论】:

所以重定向不能sudo命令中使用?例如,如果tee(我想dd)在系统上不存在,我会被淘汰吗?或者如果我也想重定向stderr,那我也会被吓到? 查看我的编辑 :) 是的,我的意思是,您可能可以使用 ssh <host> 'sudo sh -c "cat >the-file"',但您很快就会遇到“两个多层次的引用”问题,我不确定重定向是否有效通过sh -c 正确通过 ssh :) 您可以对任何您喜欢的命令使用重定向,但重定向发生在命令运行之前。 (实际上,您的问题是错误的;重定向适用于整个ssh 命令行,而不适用于sudo。)您可以使用sudo sh -c 'cat >output-file' 之类的方法来获得特权重定向,但sudo tee 更简单。使用sudo,您应该始终努力将特权操作限制为最简单的命令。 tee 显然也打印到标准输出;您可以使用tee file >/dev/null 来避免结果显示在控制台上。

以上是关于如何通过 sudo 使用输出重定向? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Linux 第三天 重定负管道符环境变量

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

显示 Windows 命令提示符输出并将其重定向到文件

可以通过 shell 重定向捕获彩色输出吗? [复制]

重定向与管道

重定向和管道