En un pequeño script bash que estoy ejecutando, estoy intentando crear un nuevo directorio que se crea. He añadido:
sudo chown $USER:$USER /var/www/$sitename
sudo chmod 775 /var/www/$sitename
después de la línea donde mkdir ( sudo mkdir /var/www/$sitename
).
Por alguna razón, el chown no se está ejecutando. Puedo ejecutarlo manualmente pero cuando está escrito en el archivo no funciona. He notado que "chown" no está resaltado en el mismo color que "mkdir" y "chmod", pero no puedo resolver mi problema.
¿Por qué Chown no funciona aquí?
¿Es un problema con $USER:$USER
?
EDITAR Aquí está el guión completo. ¿Cómo cedería el archivo a cualquier usuario no root que haya ejecutado el 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
Aparato de latón
fuente
fuente
getent group $USER
$USER
La variable se establece durante el inicio de sesión interactivo. ¿Cómo ejecuta su script: desde la sesión de inicio de sesión o usando cron o desde daemon?echo USER is $USER
, ¿qué imprime?USER is root
. Con la edición que hice, ¿crees que puedes explicar cómo dividir el archivo a cualquier usuario no root que ejecute el script?Respuestas:
Si, por algún motivo,
$USER
no está configurado, puede usar elid
comando para obtener la identidad del usuario real. Entonces, la primera vez que use la$USER
variable, puede usar la expansión de shell para proporcionar un valor predeterminado. Cambia lachown
línea en tu script a:Si
USER
está vacío o desarmado cuando se ejecuta, bash establecerá laUSER
variable en la salida de/usr/bin/id -run
fuente
Cuando llamo a mi script con
sudo
él se establecería$USER
en root.Probé el
chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename
pero todavía devolvería root.Descubrí que si usaba
who
conawk
podía obtener el usuario actual que llamó al script consudo
.fuente
currentuser
(en algún momento) con usuarios de varias líneas, use$(who | awk 'NR==1{print $1}')
en su lugar.chown -R $currentuser:$currentuser /usr
- no funciona - todavía muestra root: rootPara simplificar el problema y dado que está obteniendo el nombre de sitio variable, ¿por qué no lee una variable de nombre de usuario?
Con eso, se aseguraría de que la ejecución del script no dependa de las variables ambientales disponibles de la forma en que se ejecuta el script.
fuente
Solo hay una pequeña falla, creo. sudo abre un nuevo shell para ejecutar el comando y después de sudo el usuario es root. Entonces quizás deberías usar algo como esto:
ya que creo que MYUSER no se sobrescribe específicamente en el sistema y funcionará.
fuente
echo chown...
y vea.)