# Editing Files You Don't Own with `sudo`


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.

```command
sudo nano /var/config.yml
```

I'll add a couple of lines to it:

```yaml
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:

```command
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`:

```command
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:

```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.

```command
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:

```command
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:

```command
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:

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

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

```command
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.
