Running Complex Commands with sudo

 in

If you use sudo to run commands as root, you've probably run into “permission denied” problems when only part of a pipeline or part of a command is running with root permissions.

This fails with “permission denied” because the file is writable only by root:

$ echo 12000 > /proc/sys/vm/dirty_writeback_centisecs

But, this fails too:

$ sudo echo 12000 > /proc/sys/vm/dirty_writeback_centisecs

Why? The /bin/echo program is running as root, because of sudo, but the shell that's redirecting echo's output to the root-only file is still running as you. Your current shell does the redirection before sudo starts.

The solution is to run the whole pipeline under sudo. There are a couple ways to do it, but I prefer:

echo "echo 12000 > /proc/sys/vm/dirty_writeback_centisecs" | sudo sh

That way, I can type everything before the pipe character, and see what I'm about to run as root, then press the up arrow and add the | sudo sh to do it for real. This is not a big deal for short, obvious pipelines, but when you're building up a more complicated command as root, it's safer to look at it first before you run it.

______________________

Comments

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Why? The /bin/echo program

boediger's picture

Why? The /bin/echo program is running as root, because of sudo, but the shell that's redirecting echo's output to the root-only file is still running as you. Your current shell does the redirection before sudo starts.

The solution is to run the whole pipeline under sudo. There are a couple ways to do it, but I prefer:

boediger

A whole article decribing a

Anonymous's picture

A whole article decribing a single command line method? Surely more thought could have gone into this.

A whole article decribing a

K31th's picture

A whole article decribing a single command line method? Surely more thought could have gone into this.

tee shirts?

felipe's picture

man 1 tee
just as the above post explains, you can use tee. It is easier to visualise what's happening.

Proto's way is better.

jpenny's picture

Sorry, bad cut and paste. Proto's method shows:

Apr 3 12:00:09 xxxxxxxx sudo: xxxxxxx : TTY=pts/22 ; PWD=/tmp ; USER=root ; COMMAND=/bin/sh -c echo 0 >/proc/sys/net/ipv4/ip_forward

First set of xxxxxxxx is machine name, second is userid.

Proto's way is better

jpenny's picture

It gives better logging.

Using proto's method, auth.log shows:

Apr 3 12:00:12 xxxxxxxxx sudo: xxxxxxxx : TTY=pts/22 ; PWD=/tmp ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log

Don's way just shows:

Apr 3 11:58:02 xxxxxxxx sudo: xxxxxxxx : TTY=pts/22 ; PWD=/tmp ; USER=root ; COMMAND=/bin/sh

sudo: cd: command not found

Anonymous's picture

The one that drives me crazy is when I'm trying to change to a directory with only root access:

john@p490:~$ cd /root
john@p490:/root$ cd .gconf
bash: cd: .gconf: Permission denied
john@p490:/root$ sudo cd .gconf 
sudo: cd: command not found

I always just give up at that point and change to the root user account with:

$ sudo su -

but I guess I could stack up the commands as shown above.

I do the same with: sudo sh

Proto's picture

I do the same with:

sudo sh -c "echo 12000 > /proc/sys/vm/dirty_writeback_centisecs"

I use the same one: sudo -c

Barun's picture

I use the same one: sudo -c ''. It is the more direct approach available, than using echo with sudo.

how about 'sudo -i' first?

Gerald Marewo's picture

how about 'sudo -i' first?

I am totally agree with you,

day spa gold coast's picture

I am totally agree with you, It's really great.

another way

Joe A's picture

I like to use tee for this. Using your example, you could use
$ echo 12000 | sudo tee /proc/sys/vm/dirty_writeback_centisecs

This works for the same reason, it runs tee with sudo. You can also use
tee -a
to append to file instead of overwriting it.

White Paper
Linux Management with Red Hat Satellite: Measuring Business Impact and ROI

Linux has become a key foundation for supporting today's rapidly growing IT environments. Linux is being used to deploy business applications and databases, trading on its reputation as a low-cost operating environment. For many IT organizations, Linux is a mainstay for deploying Web servers and has evolved from handling basic file, print, and utility workloads to running mission-critical applications and databases, physically, virtually, and in the cloud. As Linux grows in importance in terms of value to the business, managing Linux environments to high standards of service quality — availability, security, and performance — becomes an essential requirement for business success.

Learn More

Sponsored by Red Hat

White Paper
Private PaaS for the Agile Enterprise

If you already use virtualized infrastructure, you are well on your way to leveraging the power of the cloud. Virtualization offers the promise of limitless resources, but how do you manage that scalability when your DevOps team doesn’t scale? In today’s hypercompetitive markets, fast results can make a difference between leading the pack vs. obsolescence. Organizations need more benefits from cloud computing than just raw resources. They need agility, flexibility, convenience, ROI, and control.

Stackato private Platform-as-a-Service technology from ActiveState extends your private cloud infrastructure by creating a private PaaS to provide on-demand availability, flexibility, control, and ultimately, faster time-to-market for your enterprise.

Learn More

Sponsored by ActiveState