Small Sharp Software Tools

Harness the Combinatoric Power of Command-Line Tools and Utilities

8. Editing Files You Don't Own with sudo

Tagged with Bash

Published February 4, 2021

A couple of tricks to change files you don't own.

Transcript

Sometimes you have to make changes to a file you don’t own. You know that you can use sudo to elevate your privileges, but you might not always want to open the file with a visual editor. Sometimes you want to append something to the file or make a change with another text processing tool.

I’m going to create a small configuration file in the /var folder on the system. I’ll run nano with sudo because the /var folder is owned by the root user; I don’t have access to put things in there myself.

$ sudo nano /var/config.yml

I’ll add a couple of lines to it:

api_key: 12345
user: brian

Then I’ll save the file and exit the editor. We’ll do the rest of the work through CLI commands.

First, let’s try to add a new line to the file. Your first thought might be to use echo to append text to the file:

$ echo "path: /var/www" >> /var/config.yml

Remember that two arrows appends text to the file.

But if you try that it doesn’t work. If you don’t own that file, or don’t have access to that file, you can’t modify it.

So you’re probably thinking you have to use sudo:

$ sudo echo "path: /var/www" >> /var/config.yml

But unfortunately that fails too!

The reason is that sudo is applied only to the echo command. The redirection happens after the echo command has completed. The redirection happens under your normal account.

To get around this, you could use sudo to copy the file to your local directory, make the changes, and then put it back.

But let’s look at a couple of shortcuts instead.

If you only need to store or add text to a file you don’t own, you can use the tee command:

$ echo "path: /var/www" | sudo tee -a /var/config.yml

The tee command takes the incoming data from standard output and sends it to the screen and a file simultaneously. And you can call it with sudo so you’ll get the elevated privileges you need. The -a flag tells tee to append the content. If you leave this flag off, it will overwrite the file.

If you look at the file’s contents, you’ll see the new line is at the end of the file.

$ cat /var/config.yml
api_key: 12345
user: brian
path: /var/www

The other way you can work with files you don’t own is to use sudo to launch a subshell:

$ sudo bash -c 'echo "src: github.com/rails/rails" >> /var/config.yml'

Look at the file again, and you’ll see the new line at the end:

$ cat /var/config.yml
api_key: 12345
user: brian
path: /var/www
src: github.com/rails/rails

This method has the added benefit of letting you use other commands too. For example, you can use sed to replace a line in the file. I’ll replace my username:

$ sudo bash -c 'sed -i -e 's/brian/bphogan/' /var/config.yml'

And when you look at the file, it’s changed:

$ cat /var/config.yml
api_key: 12345
user: bphogan
path: /var/www
src: github.com/rails/rails

So there you have it. A couple ways to modify files you don’t own, without having to open your text editor.