Answers:
同样安全的另一种选择是使用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
如果您在不使用单引号的情况下表达命令,则可以将其放在单引号中,然后通过中间外壳执行该命令。
要以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 sed
,sudo ed
,sudo 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
由于重定向到文件的权限,命令失败。重定向甚至在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中。
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转发到命令。
tee
命令以root身份运行,而不是主命令,因为它可能很复杂并且容易出现错误行为。(不是echo
)