Using chown $USER:$USER inside bash script

31,034

Solution 1

If for some reason, $USER is not set, you can use the id command to obtain the identity of the real user. So the first time you use the $USER variable, you can use the shell expansion to supply a default value. Change the chown line in your script to:

sudo chown "${USER:=$(/usr/bin/id -run)}:$USER" "/var/www/$sitename"

If USER is empty or unset when this is run, bash will set the USER variable to the output of /usr/bin/id -run.

Solution 2

When I calling my script with sudo it would set $USER to root.

$ sudo ./myscript.sh

I tried the chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename but it would still return root.

I found if I used who with awk I was able to get the current user that called the script with sudo.

currentuser=$(who | awk '{print $1}')}
chown -R $currentuser:$currentuser /var/www/$sitename`

Solution 3

In order to simplify the problem and since your are getting the variable sitename, why don't you read a username variable?

With that you'd make sure that the script execution is not dependent on the environmental variables made available the way the script is executed.

Share:
31,034

Related videos on Youtube

BrassApparatus
Author by

BrassApparatus

Updated on September 18, 2022

Comments

  • BrassApparatus
    BrassApparatus over 1 year

    In a small bash script I'm running I am attempting to chown a new directory that is created. I've added:

    sudo chown $USER:$USER /var/www/$sitename
    sudo chmod 775 /var/www/$sitename
    

    after the line where I mkdir (sudo mkdir /var/www/$sitename).

    For some reason the chown is not executing. I can execute it manually but when written in the file it doesn't work. I have noticed that "chown" is not highlighted in the same color as "mkdir" and "chmod" but I can't figure out my problem.

    Why doesn't chown work here?

    Is it an issue with $USER:$USER?

    EDIT Here is the full script. How would I chown the file to whichever non root user executed the script?

    #!/bin/sh
    #!/bin/bash
    # New Site
    
    cd /etc/apache2/sites-available/
    echo "New site name (test.my):"
    read sitename
    echo "<VirtualHost *:80>
    
            ServerAdmin admin@$sitename
    
        ServerName $sitename
    
            ServerAlias $sitename
    
        DocumentRoot /var/www/$sitename
    
            <Directory />
                    Options FollowSymLinks
                    AllowOverride All
            </Directory>
            <Directory /var/www/$sitename>
                    Options Indexes FollowSymLinks MultiViews
                    AllowOverride All
                    Order allow,deny
                    allow from all
            </Directory>
    
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    
    </VirtualHost>" > $sitename.conf
    sudo mkdir /var/www/$sitename
    sudo chown $USER:$USER /var/www/$sitename
    echo USER is $USER
    sudo chmod 775 /var/www/$sitename
    sudo a2ensite $sitename.conf
    sudo apachectl restart
    echo "New site created"
    
  • roaima
    roaima almost 8 years
    The variable is evaluated before the command is executed, so your suggested alternative would make no difference. (Try it with echo chown... and see.)
  • Illuminator
    Illuminator over 6 years
    To prevent setting currentuser (sometime) with multiline users, use $(who | awk 'NR==1{print $1}') instead.
  • Admin
    Admin almost 2 years
    (1) who is not guaranteed to produce any output.  (2) If it does, there is no guarantee that the first line of output identifies the current user.  What if somebody ssh’ed into your system?  What if you are ssh’ed into some other system? (3) logname seems to be more reliable.