Utilisation de chown $ USER: $ USER dans le script bash

10

Dans un petit script bash que j'exécute, j'essaie de visualiser un nouveau répertoire créé. J'ai ajouté:

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

après la ligne où je mkdir ( sudo mkdir /var/www/$sitename).

Pour une raison quelconque, le chown n'est pas en cours d'exécution. Je peux l'exécuter manuellement mais lorsqu'il est écrit dans le fichier, cela ne fonctionne pas. J'ai remarqué que "chown" n'est pas surligné de la même couleur que "mkdir" et "chmod" mais je n'arrive pas à comprendre mon problème.

Pourquoi chown ne fonctionne-t-il pas ici?

Est-ce un problème avec $USER:$USER?

EDIT Voici le script complet. Comment pourrais-je chown le fichier à n'importe quel utilisateur non root a exécuté le 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"
BrassApparatus
la source
1
Y a-t-il un groupe nommé $ USER? getent group $USER
Cyrus
1
$USERest définie lors de la connexion interactive. Comment exécutez-vous votre script - à partir de la session de connexion ou en utilisant cron ou à partir du démon?
myaut
1
Vérifiez si la variable USER est même vue par le script. Si vous ajoutez une ligne à votre script qui dit echo USER is $USER, qu'est-ce que cela imprime?
Mark Plotnick
@MarkPlotnick De toute évidence, USER is root. Avec la modification que j'ai effectuée, pensez-vous pouvoir expliquer comment chowner le fichier à l'utilisateur non root qui exécute le script?
BrassApparatus
@myaut Je l'exécute manuellement depuis le terminal.
BrassApparatus

Réponses:

8

Si, pour une raison quelconque, $USERn'est pas défini, vous pouvez utiliser la idcommande pour obtenir l'identité de l'utilisateur réel. Ainsi, la première fois que vous utilisez la $USERvariable, vous pouvez utiliser l'expansion du shell pour fournir une valeur par défaut. Changez la chownligne de votre script en:

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

Si USERest vide ou non défini lors de son exécution, bash définira la USERvariable sur la sortie de/usr/bin/id -run

Tim Cutts
la source
4

Lorsque j'appelais mon script avec, sudoil était défini $USERsur root.

$ sudo ./myscript.sh

J'ai essayé le chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitenamemais il retournerait quand même root.

J'ai trouvé que si j'utilisais whoavec, awkj'ai pu obtenir l'utilisateur actuel qui a appelé le script avec sudo.

currentuser=$(who | awk '{print $1}')}
chown -R $currentuser:$currentuser /var/www/$sitename`
Eric James Deiter
la source
1
Pour empêcher la configuration currentuser(parfois) avec des utilisateurs multilignes, utilisez $(who | awk 'NR==1{print $1}')plutôt.
Illuminateur le
J'essaie de changer / usr pour mon utilisateur: chown -R $currentuser:$currentuser /usr - ne fonctionne pas - affiche toujours root: root
Sam-T
2

Afin de simplifier le problème et puisque vous obtenez la variable sitename, pourquoi ne lisez-vous pas une variable de nom d'utilisateur?

Avec cela, vous vous assureriez que l'exécution du script ne dépend pas des variables d'environnement mises à disposition de la manière dont le script est exécuté.

marcosjsramos
la source
0

Il n'y a qu'une petite faute je pense. sudo ouvre un nouveau shell pour exécuter la commande et après sudo l'utilisateur est root. Alors peut-être que vous devriez utiliser quelque chose comme ça:

MYUSER = $ USER

sudo chown $ MYUSER: $ MYUSER

car je pense que MYUSER n'est pas spécifique au système et doit fonctionner.

Andreas Bartels
la source
1
La variable est évaluée avant l'exécution de la commande, donc votre alternative suggérée ne ferait aucune différence. (Essayez avec echo chown...et voyez.)
roaima