Verwenden von chown $ USER: $ USER im Bash-Skript


10

In einem kleinen Bash-Skript, das ich ausführe, versuche ich, ein neues Verzeichnis zu erstellen, das erstellt wird. Ich habe hinzugefügt:

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

nach der Zeile, in der ich mkdir ( sudo mkdir /var/www/$sitename).

Aus irgendeinem Grund wird das Chown nicht ausgeführt. Ich kann es manuell ausführen, aber wenn es in die Datei geschrieben wird, funktioniert es nicht. Ich habe festgestellt, dass "chown" nicht in der gleichen Farbe wie "mkdir" und "chmod" hervorgehoben ist, aber ich kann mein Problem nicht herausfinden.

Warum funktioniert Chown hier nicht?

Ist es ein Problem mit $USER:$USER?

BEARBEITEN Hier ist das vollständige Skript. Wie würde ich die Datei an den Nicht-Root-Benutzer weiterleiten, der das Skript ausgeführt hat?

#!/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
Gibt es eine Gruppe namens $ USER? getent group $USER
Cyrus

1
$USERDie Variable wird während der interaktiven Anmeldung festgelegt. Wie führen Sie Ihr Skript aus - von der Anmeldesitzung oder mit cron oder vom Daemon?
Myaut

1
Überprüfen Sie, ob die USER-Variable überhaupt vom Skript gesehen wird. Wenn Sie Ihrem Skript eine Zeile hinzufügen, die besagt echo USER is $USER, was wird gedruckt?
Mark Plotnick

@MarkPlotnick Offensichtlich , USER is root. Glauben Sie, dass Sie mit der von mir vorgenommenen Bearbeitung erklären können, wie die Datei an den Benutzer weitergeleitet wird, der das Skript ausführt?
BrassApparatus

@myaut Ich führe es manuell vom Terminal aus.
BrassApparatus

Antworten:


8

Wenn aus irgendeinem Grund $USERnicht festgelegt ist, können Sie den idBefehl verwenden, um die Identität des tatsächlichen Benutzers abzurufen. Wenn Sie die $USERVariable zum ersten Mal verwenden , können Sie mithilfe der Shell-Erweiterung einen Standardwert angeben. Ändern Sie die chownZeile in Ihrem Skript in:

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

Wenn dies USERleer ist oder nicht gesetzt ist, setzt bash die USERVariable auf die Ausgabe von/usr/bin/id -run


4

Wenn ich mein Skript sudodamit aufrufe, wird es $USERauf root gesetzt.

$ sudo ./myscript.sh

Ich habe das versucht, chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitenameaber es würde immer noch root zurückgeben.

Wenn ich whomit verwendet awkhabe, konnte ich den aktuellen Benutzer ermitteln, mit dem das Skript aufgerufen wurde sudo.

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

1
currentuserVerwenden Sie $(who | awk 'NR==1{print $1}')stattdessen, um das Einstellen (manchmal) bei mehrzeiligen Benutzern zu verhindern .
Illuminator

Ich versuche, / usr zu meinem Benutzer zu ändern: chown -R $currentuser:$currentuser /usr - funktioniert nicht - zeigt immer noch root: root
Sam-T

2

Warum lesen Sie nicht eine Benutzername-Variable, um das Problem zu vereinfachen und da Sie die Variable Site-Name erhalten?

Damit stellen Sie sicher, dass die Skriptausführung nicht von den Umgebungsvariablen abhängt, die für die Ausführung des Skripts verfügbar gemacht werden.


0

Ich denke, es gibt nur einen winzigen Fehler. sudo öffnet eine neue Shell zum Ausführen des Befehls und nach sudo ist der Benutzer root. Vielleicht sollten Sie so etwas verwenden:

MYUSER = $ USER

sudo chown $ MYUSER: $ MYUSER

da ich denke MYUSER ist nicht systemspezifisch überschrieben und soll funktionieren.


1
Die Variable wird ausgewertet, bevor der Befehl ausgeführt wird, sodass Ihre vorgeschlagene Alternative keinen Unterschied macht. (Versuchen Sie es mit echo chown...und sehen Sie.)
Roaima
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.