BASH Scripting, su to www-data for single command

94,152

Solution 1

Just use su - www-data -c 'svnadmin create /svn/repository' in your script run by root. So that only this command is run by www-data user.


Update for future viewers:

In case you receive a "This account is currently not available" error, consider using:

su - www-data -s /bin/bash -c 'svnadmin create /svn/repository'

( @Petr 's valuable mention about -s flag to accommodate www-data user's no login policy )

Solution 2

With 'su' is probably that request a password, and www-data doesn't have password. I recommend the command sudo:

 sudo -u www-data command

The condition is that your user must be root, or configurated in the sudoers file

Solution 3

2 Possible approaches:


1) sudo command:

In most cases you will have access to the sudo command and so the solution is simply:

sudo -u target_user target_command


2) su command (if sudo not installed. Ex. alpine-linux images):

su - target_user -c 'target_command'

In case you receive a 'This account is currently not available' error, the user has a no login (shell access) policy in effect. If so, consider using:

su - target_user -s /bin/bash -c 'target_command'

(Based on @Petr 's valuable comment about -s flag to accommodate www-data user's no login policy)

Solution 4

Use su:

   su [options] [username]

   The options which apply to the su command are:

   -c, --command COMMAND
       Specify a command that will be invoked by the shell using its -c.
Share:
94,152

Related videos on Youtube

Brendon Dugan
Author by

Brendon Dugan

Updated on September 18, 2022

Comments

  • Brendon Dugan
    Brendon Dugan almost 2 years

    I am working on automating the creation of subversion repositories and associated websites as described in this blog post I wrote. I am running into issues right around the part where I su to the www-data user to run the following command:

    svnadmin create /svn/repository
    

    There is a check at the beginning of the script that makes sure it is running as root or sudo, and everything after that one command needs to be run as root. Is there a good way to run that one command as www-data and then switch back to root to finish up?

  • Brendon Dugan
    Brendon Dugan about 12 years
    Yeah, it appears I forgot a basic rule of scripting... RTFM. Thanks!
  • rubo77
    rubo77 over 8 years
    Trying this, I get the error This account is currently not available.
  • Andrew
    Andrew over 8 years
    I also get this error, but futbolsalas15's answer below works fine.
  • Petr
    Petr over 8 years
    Use su - www-data -s /bin/bash -c 'your_command' to make this work. User www-data has shell /usr/sbin/nologin so without the -s parameter it leads to the error message.
  • Frantumn
    Frantumn about 7 years
    It should be noted that su commands don't work with accounts that have disabled logins (such as www-data). You'll have to use sudo.
  • Captain Hypertext
    Captain Hypertext over 6 years
    Wow, why isn't this the selected answer? Took me way too long to find this.
  • Jared
    Jared over 3 years
    the sudo -u www-data target_command version worked for me, thanks!
  • Michael J
    Michael J over 2 years
    Yes, this is the easiest approach to running a command as www-data user. Thanks!