Usando chown $ USER: $ USER dentro del script bash

10

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"
Aparato de latón
fuente
1
¿Hay un grupo llamado $ USER? getent group $USER
Cyrus
1
$USERLa 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?
myaut
1
Verifique si la variable USER incluso es vista por el script. Si agrega una línea a su script que dice echo USER is $USER, ¿qué imprime?
Mark Plotnick
@MarkPlotnick Evidentemente, 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?
BrassApparatus
@myaut Lo ejecuto manualmente desde la terminal.
BrassApparatus

Respuestas:

8

Si, por algún motivo, $USERno está configurado, puede usar el idcomando para obtener la identidad del usuario real. Entonces, la primera vez que use la $USERvariable, puede usar la expansión de shell para proporcionar un valor predeterminado. Cambia la chownlínea en tu script a:

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

Si USERestá vacío o desarmado cuando se ejecuta, bash establecerá la USERvariable en la salida de/usr/bin/id -run

Tim Cutts
fuente
4

Cuando llamo a mi script con sudoél se establecería $USERen root.

$ sudo ./myscript.sh

Probé el chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitenamepero todavía devolvería root.

Descubrí que si usaba whocon awkpodía obtener el usuario actual que llamó al script con sudo.

currentuser=$(who | awk '{print $1}')}
chown -R $currentuser:$currentuser /var/www/$sitename`
Eric James Deiter
fuente
1
Para evitar la configuración currentuser(en algún momento) con usuarios de varias líneas, use $(who | awk 'NR==1{print $1}')en su lugar.
Iluminador
Estoy tratando de cambiar / usr a mi usuario: chown -R $currentuser:$currentuser /usr - no funciona - todavía muestra root: root
Sam-T
2

Para 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.

marcosjsramos
fuente
0

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:

MYUSER = $ USER

sudo chown $ MYUSER: $ MYUSER

ya que creo que MYUSER no se sobrescribe específicamente en el sistema y funcionará.

Andreas Bartels
fuente
1
La variable se evalúa antes de ejecutar el comando, por lo que su alternativa sugerida no haría ninguna diferencia. (Pruébelo echo chown...y vea.)
roaima