如何运行涉及使用sudo重定向或管道传输的命令?


60

我正在尝试遵循我认为是使用sudo而不是root帐户的最佳实践。

我正在运行一个简单的concat文件操作,例如:

sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

在以普通用户身份运行的“ >>”右侧,此操作失败。添加额外的sudo也会失败(预期的行为,因为通过管道传递给sudo命令而不是文件)。

例子仅此而已,但已在root帐户下进行了验证和测试。

Answers:


75

您可以以root用户身份调用新的shell:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

您还可以提升一个过程来写入文件:

sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF

8
通常,第二个选项更安全,因为只有tee命令以root身份运行,而不是主命令,因为它可能很复杂并且容易出现错误行为。(不是echo
pabouk

19

同样安全的另一种选择是使用sudo-i开关以root身份登录:

$ sudo -i
# echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

这仍然遵循最佳实践规则,因为实际上并没有启用root帐户,但可以安全地以root身份进行操作。来自man sudo

The -i (simulate initial login) option runs the shell
    specified by the password database entry of the target user
    as a login shell.  This means that login-specific resource
    files such as .profile or .login will be read by the shell.
    If a command is specified, it is passed to the shell for
    execution via the shell's -c option.  If no command is
    specified, an interactive shell is executed. 

另一个选择是sudo bash
starbeamrainbowlabs 2015年

11

如果您在不使用单引号的情况下表达命令,则可以将其放在单引号中,然后通过中间外壳执行该命令。

要以root身份执行此操作:

echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

使用不使用的其他方式编写命令'

echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock

然后调用sudo sh -c …

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

或者,要将输出写入只有root用户可以写入的文件,请调用sudo tee。传递-a选项以tee将其追加到目标文件,否则文件将被截断。

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

对于更复杂的文件修改,你可以打电话sudo sedsudo edsudo perl,...

或者,使用体面的编辑器并将其称为sudo。在Emacs中,打开/sudo:/etc/conf.d/hwclock。在Vim中,调用:w !sudo tee %以root身份写入打开的文件,或者使用sudo.vim插件。或者从sudo结束并致电sudoedit /etc/conf.d/hwclock

或者,您也可以屈服于黑暗面,并以root用户身份运行shell。

$ sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

5

由于重定向到文件的权限,命令失败。重定向甚至在sudo调用命令之前发生。

您必须确保实际上是根目录才能打开文件进行写入。

最简单的方法是:

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

echo,因为它只是产生一个字符串,可以运行你的普通用户。该tee实用程序将必须以root用户身份运行,tee -a并将追加数据。我们将输出重定向到,/dev/null因为tee,默认情况下,除了写入指示的文件之外,还会将其输入数据复制到其标准输出。

with bash或任何可理解“ here-strings”的shell:

sudo tee -a /etc/conf.d/hwclock >/dev/null <<<'clock_hctosys="YES"'

这与上面的效果相同。仅改变我们产生字符串的方式。


另一种稍微绕行的方式:

sudo sh -c 'echo clock_hctosys=\"YES\" >>/etc/conf.d/hwclock'

在这里,重定向发生在sh -c以root用户身份运行的子shell中。


4

sudo dd of=

根据需要添加:

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

或从头开始重新创建文件:

echo inbytes | sudo dd of=outfile

好处:

  • tee没有/dev/null重定向更好
  • sh没有子弹更好
  • dd有很多强大的选项,例如status=progress查看传输进度

有效,因为sudo将stdin转发到命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.