Using chown $USER:$USER inside bash script
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.
Related videos on Youtube
BrassApparatus
Updated on September 18, 2022Comments
-
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 almost 8 yearsThe variable is evaluated before the command is executed, so your suggested alternative would make no difference. (Try it with
echo chown...
and see.) -
Illuminator over 6 yearsTo prevent setting
currentuser
(sometime) with multiline users, use$(who | awk 'NR==1{print $1}')
instead. -
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 somebodyssh
’ed into your system? What if you aressh
’ed into some other system? (3)logname
seems to be more reliable.