Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I am trying to follow what I assume is best practises of using sudo instead of root account.

I am running a simple concat file operation such as:

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

This fails as to the right of the ">>" it is running as the normal user. Adding extra sudos also fails (expected behaviour since piping to the sudo command and not to the file).

Example is just that but it has been verified and tested under the root account.

share|improve this question

3 Answers 3

up vote 11 down vote accepted

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
share|improve this answer

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:

   -i [command]
               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.  
share|improve this answer

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 /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
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.