Używanie chown $ USER: $ USER w skrypcie bash

10

W małym skrypcie bash, który uruchamiam, próbuję utworzyć nowy katalog, który jest tworzony. Dodałem:

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

po wierszu, w którym I mkdir ( sudo mkdir /var/www/$sitename).

Z jakiegoś powodu chown nie wykonuje się. Mogę go wykonać ręcznie, ale po zapisaniu w pliku nie działa. Zauważyłem, że „chown” nie jest podświetlony w tym samym kolorze co „mkdir” i „chmod”, ale nie mogę zrozumieć mojego problemu.

Dlaczego chown tu nie działa?

Czy to problem $USER:$USER?

EDYCJA Oto pełny skrypt. Jak przełączyć plik na użytkownika, który nie wykonał roota?

#!/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"
Mosiądz Aparatura
źródło
1
Czy istnieje grupa o nazwie $ USER? getent group $USER
Cyrus
1
$USERZmienna jest ustawiana podczas logowania interaktywnego. Jak uruchomić skrypt - z sesji logowania lub przy użyciu crona lub demona?
myaut
1
Sprawdź, czy skrypt USER w ogóle widzi zmienną. Jeśli dodasz wiersz do skryptu, który mówi echo USER is $USER: co wydrukuje?
Mark Plotnick,
@MarkPlotnick Najwyraźniej USER is root. Czy wprowadzając dokonaną przez Ciebie edycję myślisz, że możesz wyjaśnić, w jaki sposób przeglądać plik komukolwiek, kto nie jest rootem, który wykonuje skrypt?
BrassApparatus
@myaut Uruchomię go ręcznie z terminala.
BrassApparatus

Odpowiedzi:

9

Jeśli z jakiegoś powodu $USERnie jest ustawiony, możesz użyć idpolecenia, aby uzyskać tożsamość rzeczywistego użytkownika. Tak więc przy pierwszym użyciu $USERzmiennej można użyć rozszerzenia powłoki do podania wartości domyślnej. Zmień chownwiersz w skrypcie na:

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

Jeśli USERjest pusty lub nieuzbrojony, gdy jest uruchamiany, bash ustawi USERzmienną na wyjście/usr/bin/id -run

Tim Cutts
źródło
4

Gdy wywołuję mój skrypt sudo, ustawię się $USERna rootowanie.

$ sudo ./myscript.sh

Próbowałem, chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitenameale nadal będzie to root.

Przekonałem się, że jeśli korzystałem whoz niego, awkbyłem w stanie uzyskać bieżącego użytkownika, który wywołał skrypt sudo.

currentuser=$(who | awk '{print $1}')}
chown -R $currentuser:$currentuser /var/www/$sitename`
Eric James Deiter
źródło
1
Aby zapobiec ustawianiu currentuser(czasami) użytkownikom wielowierszowym, użyj $(who | awk 'NR==1{print $1}')zamiast tego.
Iluminator
Próbuję zmienić / usr na mojego użytkownika: chown -R $currentuser:$currentuser /usr - nie działa - nadal pokazuje root: root
Sam-T
2

Aby uprościć problem i skoro otrzymujesz zmienną sitename, dlaczego nie czytasz zmiennej nazwy użytkownika?

Dzięki temu upewnisz się, że wykonanie skryptu nie zależy od zmiennych środowiskowych udostępnionych w sposobie wykonywania skryptu.

marcosjsramos
źródło
0

Myślę, że jest tylko niewielka wina. sudo otwiera nową powłokę do wykonania polecenia, a po sudo użytkownik jest rootem. Może więc powinieneś użyć czegoś takiego:

MYUSER = USER $

sudo chown $ MYUSER: $ MYUSER

ponieważ uważam, że MYUSER nie jest nadpisany przez system i powinien działać.

Andreas Bartels
źródło
1
Zmienna jest oceniana przed wykonaniem polecenia, więc sugerowana alternatywa nie miałaby znaczenia. (Spróbuj echo chown...i przekonaj się.)
roaima,