Usando chown $ USER: $ USER all'interno dello script bash


10

In un piccolo script bash che sto eseguendo, sto tentando di creare una nuova directory creata. Ho aggiunto:

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

dopo la linea in cui mkdir ( sudo mkdir /var/www/$sitename).

Per qualche motivo il chown non sta eseguendo. Posso eseguirlo manualmente ma quando scritto nel file non funziona. Ho notato che "chown" non è evidenziato nello stesso colore di "mkdir" e "chmod" ma non riesco a capire il mio problema.

Perché il chown non funziona qui?

È un problema con $USER:$USER?

EDIT Ecco lo script completo. Come chown il file a qualsiasi utente non root eseguisse lo 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"

1
C'è un gruppo chiamato $ USER? getent group $USER
Ciro,

1
$USERla variabile viene impostata durante l'accesso interattivo. Come si esegue lo script - dalla sessione di accesso o utilizzando cron o dal demone?
myaut,

1
Controlla se la variabile USER è vista dallo script. Se aggiungi una riga al tuo script che dice echo USER is $USER, cosa stampa?
Mark Plotnick,

@MarkPlotnick Evidentemente, USER is root. Con la modifica che ho apportato pensi di poter spiegare come chown il file a qualunque utente non root esegua lo script?
BrassApparatus,

@myaut Lo eseguo manualmente dal terminale.
BrassApparatus,

Risposte:


8

Se, per qualche motivo, $USERnon è impostato, è possibile utilizzare il idcomando per ottenere l'identità dell'utente reale. Quindi la prima volta che usi la $USERvariabile, puoi usare l'espansione della shell per fornire un valore predefinito. Cambia la chownriga nel tuo script in:

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

Se USERè vuoto o non impostato quando viene eseguito, bash imposterà la USERvariabile sull'output di/usr/bin/id -run


4

Quando chiamo il mio script con sudoesso sarebbe impostato $USERsu root.

$ sudo ./myscript.sh

Ho provato il chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitenamema avrebbe comunque restituito root.

Ho scoperto che se usato whocon awkero in grado di ottenere l'utente corrente che ha chiamato lo script con sudo.

currentuser=$(who | awk '{print $1}')}
chown -R $currentuser:$currentuser /var/www/$sitename`

1
Per impedire l'impostazione currentuser(a volte) con utenti multilinea, utilizzare $(who | awk 'NR==1{print $1}')invece.
Illuminatore

Sto cercando di cambiare / usr per il mio utente: chown -R $currentuser:$currentuser /usr - non funziona - mostra ancora root: root
Sam-T

2

Per semplificare il problema e poiché stai ottenendo la variabile sitename, perché non leggi una variabile username?

Con ciò ti assicureresti che l'esecuzione dello script non dipenda dalle variabili ambientali rese disponibili nel modo in cui lo script viene eseguito.


0

C'è solo un piccolo difetto, penso. sudo apre una nuova shell per l'esecuzione del comando e dopo sudo l'utente è root. Quindi forse dovresti usare qualcosa del genere:

MYUSER = $ USER

sudo chown $ MYUSER: $ MYUSER

poiché penso che MYUSER non sia sovrascritto sistemicamente e funzionerà.


1
La variabile viene valutata prima dell'esecuzione del comando, quindi la tua alternativa suggerita non farebbe alcuna differenza. (Provalo con echo chown...e vedi.)
roaima,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.