bash 스크립트에서 chown $USER:$USER 사용

bash 스크립트에서 chown $USER:$USER 사용

내가 실행 중인 작은 bash 스크립트에서 생성된 새 디렉터리를 표시하려고 합니다. 나는 다음을 추가했습니다:

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

I mkdir() 줄 다음 sudo mkdir /var/www/$sitename.

어떤 이유로 chown이 실행되지 않습니다. 수동으로 할 수는 있지만 파일에 쓸 때는 작동하지 않습니다. "chown"이 "mkdir" 및 "chmod"와 같은 색상으로 강조 표시되지 않는 것을 확인했지만 내 문제를 파악할 수 없습니다.

chown이 여기서 작동하지 않는 이유는 무엇입니까?

그게 문제인가요 $USER:$USER?

편집하다 다음은 전체 스크립트입니다. 스크립트를 실행하는 루트가 아닌 사용자에게 파일을 어떻게 chown합니까?

#!/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설정되지 않은 경우 이 id명령을 사용하여 실제 사용자의 신원을 얻을 수 있습니다. 따라서 쉘 확장을 사용하여 변수가 처음 사용될 때 $USER기본값을 제공할 수 있습니다 . chown스크립트의 줄을 다음과 같이 변경합니다 .

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

런타임에 비어 있거나 설정되지 않은 경우 USERbash는 변수 USER/usr/bin/id -run.

답변2

스크립트를 호출하면 루트로 sudo설정됩니다 $USER.

$ sudo ./myscript.sh

시도해 보았지만 chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename여전히 루트를 반환합니다.

whowith 을 사용하면 awk호출 스크립트를 사용하여 현재 사용자를 얻을 수 있다는 것을 알았습니다 sudo.

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

답변3

문제를 단순화하기 위해 sitename 변수를 얻었으므로 사용자 이름 변수를 읽어 보는 것은 어떨까요?

이렇게 하면 스크립트 실행이 스크립트 실행 방식에 사용 가능한 환경 변수에 의존하지 않도록 할 수 있습니다.

답변4

작은 오류가 하나 있는 것 같아요. sudo는 명령을 실행하기 위해 새 쉘을 엽니다. sudo 이후 사용자는 루트입니다. 따라서 다음과 같은 것을 사용해야 할 수도 있습니다.

myuser=$user

Sudo chown $MYUSER:$MYUSER

MYUSER는 시스템 특정 재정의가 아니며 작동할 것이라고 생각하기 때문입니다.

관련 정보