Использование 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"

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?

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


0

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

MyUser = $ USER

sudo chown $ MYUSER: $ MYUSER

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


1
Переменная оценивается перед выполнением команды, поэтому предложенная вами альтернатива не будет иметь значения. (Попробуйте echo chown...и посмотрите.)
roaima
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.