Використання 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?

EDIT Ось повний сценарій. Як би я порушив файл тому, хто не користувач 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
Чи існує група з назвою US USER? getent group $USER
Кіра

1
$USERзмінна встановлюється під час інтерактивного входу. Як запускати свій скрипт - із сеансу входу в систему чи за допомогою cron або від демон?
myaut

1
Перевірте, чи змінна сценарій USER бачиться навіть у сценарії. Якщо ви додасте рядок до свого сценарію, який говорить echo USER is $USER, що він роздруковує?
Марк Плотнік

@MarkPlotnick Очевидно, що USER is root. Зі зробленим вами редагуванням, чи вважаєте ви, що ви можете пояснити, як порушити файл тому, хто виконує сценарій не-root?
BrassApparat

@myaut Я запускаю його вручну з терміналу.
BrassApparat

Відповіді:


9

Якщо з якихось причин $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корінь.

$ sudo ./myscript.sh

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

Я знайшов , якщо я 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

Для того, щоб спростити проблему, а оскільки ви отримуєте ім’я змінної сайту, чому б вам не прочитати змінну імені користувача?

З цим ви переконаєтесь, що виконання сценарію не залежить від змінних навколишнього середовища, доступних способу виконання сценарію.


0

Є лише крихітна помилка, на яку я думаю. sudo відкриває нову оболонку для виконання команди, а після sudo користувач має root. Тож, можливо, вам слід скористатися чимось подібним:

MYUSER = $ USER

судо-чоун $ МЮСЕР: $ МЮСЕР

як я думаю, МЮСЕР не є системним видозміненим і він працюватиме.


1
Змінна оцінюється до того, як команда буде виконана, тому запропонована нами альтернатива не мала б значення. (Спробуйте echo chown...і подивіться.)
roaima
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.