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"
bash
shell-script
terminal
gnome-terminal
chown
BrassApparatus
la source
la source
getent group $USER
$USER
est 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?echo USER is $USER
, qu'est-ce que cela imprime?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?Réponses:
Si, pour une raison quelconque,
$USER
n'est pas défini, vous pouvez utiliser laid
commande pour obtenir l'identité de l'utilisateur réel. Ainsi, la première fois que vous utilisez la$USER
variable, vous pouvez utiliser l'expansion du shell pour fournir une valeur par défaut. Changez lachown
ligne de votre script en:Si
USER
est vide ou non défini lors de son exécution, bash définira laUSER
variable sur la sortie de/usr/bin/id -run
la source
Lorsque j'appelais mon script avec,
sudo
il était défini$USER
sur root.J'ai essayé le
chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename
mais il retournerait quand même root.J'ai trouvé que si j'utilisais
who
avec,awk
j'ai pu obtenir l'utilisateur actuel qui a appelé le script avecsudo
.la source
currentuser
(parfois) avec des utilisateurs multilignes, utilisez$(who | awk 'NR==1{print $1}')
plutôt.chown -R $currentuser:$currentuser /usr
- ne fonctionne pas - affiche toujours root: rootAfin 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é.
la source
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:
car je pense que MYUSER n'est pas spécifique au système et doit fonctionner.
la source
echo chown...
et voyez.)