如何通过 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 连接执行此操作,因此使用文本编辑器是不可能的”。这个结论并不像你做出的那样不言自明。 vim
、nano
甚至 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 使用输出重定向? [复制]的主要内容,如果未能解决你的问题,请参考以下文章