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"
bash
shell-script
terminal
gnome-terminal
chown
BrassApparatus
quelle
quelle
getent group $USER
$USER
Die Variable wird während der interaktiven Anmeldung festgelegt. Wie führen Sie Ihr Skript aus - von der Anmeldesitzung oder mit cron oder vom Daemon?echo USER is $USER
, was wird gedruckt?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?Antworten:
Wenn aus irgendeinem Grund
$USER
nicht festgelegt ist, können Sie denid
Befehl verwenden, um die Identität des tatsächlichen Benutzers abzurufen. Wenn Sie die$USER
Variable zum ersten Mal verwenden , können Sie mithilfe der Shell-Erweiterung einen Standardwert angeben. Ändern Sie diechown
Zeile in Ihrem Skript in:Wenn dies
USER
leer ist oder nicht gesetzt ist, setzt bash dieUSER
Variable auf die Ausgabe von/usr/bin/id -run
quelle
Wenn ich mein Skript
sudo
damit aufrufe, wird es$USER
auf root gesetzt.Ich habe das versucht,
chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename
aber es würde immer noch root zurückgeben.Wenn ich
who
mit verwendetawk
habe, konnte ich den aktuellen Benutzer ermitteln, mit dem das Skript aufgerufen wurdesudo
.quelle
currentuser
Verwenden Sie$(who | awk 'NR==1{print $1}')
stattdessen, um das Einstellen (manchmal) bei mehrzeiligen Benutzern zu verhindern .chown -R $currentuser:$currentuser /usr
- funktioniert nicht - zeigt immer noch root: rootWarum 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.
quelle
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:
da ich denke MYUSER ist nicht systemspezifisch überschrieben und soll funktionieren.
quelle
echo chown...
und sehen Sie.)