How to run a command that involves redirecting or piping with sudo?
You can invoke a new shell as root:
sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'
You could also just elevate a process to write to the file:
sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF
Another option, equally safe, is to use sudo
's -i
switch to log in as root:
$ sudo -i
# echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'
This still follows best practice rules since the root account is not actually enabled as such but lets you do things as root safely. From 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.
If you express your command without single quotes, you can put it inside single quotes and execute that via an intermediate shell.
To execute this as root:
echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock
Write the command a different way that doesn't use '
:
echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock
Then invoke sudo sh -c …
:
sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'
Alternatively, to write output to a file that only root can write to, call sudo tee
. Pass the -a
option to tee
to append to the destination file, otherwise the file is truncated.
echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null
For more complex file modifications, you can call sudo sed
, sudo ed
, sudo perl
, …
Alternatively, use a decent editor and make it call sudo. In Emacs, open /sudo:/etc/conf.d/hwclock
. In Vim, call :w !sudo tee %
to write to the opened file as root, or use the sudo.vim plugin. Or go from the sudo end and call sudoedit /etc/conf.d/hwclock
.
Or you can give in to the dark side and run a shell as root.
$ sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock