Использование chown $ USER: $ USER внутри bash-скрипта

10

В небольшом скрипте bash, который я запускаю, я пытаюсь создать новый каталог, который создается. Я добавил:

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

после строки, где я mkdir ( sudo mkdir /var/www/$sitename).

По некоторым причинам чоун не выполняется. Я могу выполнить его вручную, но при записи в файл это не работает. Я заметил, что «chown» не выделен тем же цветом, что и «mkdir» и «chmod», но я не могу понять свою проблему.

Почему здесь не работает работа?

Это проблема с $USER:$USER?

РЕДАКТИРОВАТЬ Вот полный сценарий. Как бы я выбрал файл для того, кто бы не выполнял сценарий пользователем без прав root?

#!/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"
BrassApparatus
источник
1
Есть ли группа с именем $ USER? getent group $USER
Cyrus
1
$USERпеременная устанавливается во время интерактивного входа в систему. Как вы запускаете свой скрипт - из сеанса входа в систему или с помощью cron или из демона?
Myaut
1
Проверьте, видна ли переменная USER сценарием. Если вы добавите в свой скрипт строку с надписью echo USER is $USER, что она печатает?
Марк Плотник
@MarkPlotnick Очевидно, что USER is root. Как вы думаете, с помощью редактирования, которое вы сделали, вы можете объяснить, как создать файл, чтобы тот, кто не является пользователем root, выполнял сценарий?
Медный аппарат
@myaut Я запускаю его вручную из терминала.
Медный аппарат

Ответы:

8

Если по какой-либо причине $USERне установлено, вы можете использовать idкоманду для получения личности реального пользователя. Поэтому при первом использовании $USERпеременной вы можете использовать расширение оболочки, чтобы указать значение по умолчанию. Измените chownстроку в вашем скрипте на:

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

Если USERпри запуске он пуст или не установлен, bash установит USERпеременную на выход/usr/bin/id -run

Тим Каттс
источник
4

Когда я вызываю свой скрипт, sudoон устанавливается $USERв root.

$ sudo ./myscript.sh

Я попробовал, chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitenameно он все равно вернет root.

Я обнаружил, что если я использовал whoс, awkя смог получить текущего пользователя, который вызвал скрипт с sudo.

currentuser=$(who | awk '{print $1}')}
chown -R $currentuser:$currentuser /var/www/$sitename`
Эрик Джеймс Дейтер
источник
1
Чтобы предотвратить настройку currentuser(иногда) для многострочных пользователей, используйте $(who | awk 'NR==1{print $1}')вместо этого.
Иллюминатор
Я пытаюсь изменить / usr для моего пользователя: chown -R $currentuser:$currentuser /usr - не работает - по-прежнему показывает root: root
Sam-T
2

Чтобы упростить проблему и поскольку вы получаете переменную sitename, почему бы вам не прочитать переменную username?

При этом вы убедитесь, что выполнение сценария не зависит от переменных среды, доступных для способа выполнения сценария.

marcosjsramos
источник
0

Я думаю, что есть только маленькая ошибка. sudo открывает новую оболочку для выполнения команды, и после sudo пользователь является пользователем root. Поэтому, возможно, вам следует использовать что-то вроде этого:

MyUser = $ USER

sudo chown $ MYUSER: $ MYUSER

так как я думаю, что МЮСЕР не переписан и будет работать.

Андреас Бартельс
источник
1
Переменная оценивается перед выполнением команды, поэтому предложенная вами альтернатива не будет иметь значения. (Попробуйте echo chown...и посмотрите.)
roaima