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


10

작은 bash 스크립트에서 내가 실행중인 새 디렉토리를 만들려고합니다. 나는 추가했다 :

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

내가 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라는 그룹이 있습니까? getent group $USER
Cyrus

1
$USER변수는 대화식 로그인 중에 설정됩니다. 로그인 세션이나 cron 또는 데몬에서 스크립트를 어떻게 실행합니까?
myaut

1
스크립트에서 USER 변수가 보이는지 확인하십시오. 스크립트에이라고 표시된 줄을 추가하면 echo USER is $USER무엇을 인쇄합니까?
Mark Plotnick

@MarkPlotnick 분명히 USER is root. 내가 편집 한 내용으로 루트가 아닌 사용자가 스크립트를 실행하는 사람에게 파일을 숨기는 방법을 설명 할 수 있다고 생각하십니까?
BrassApparatus

@ myaut 터미널에서 수동으로 실행합니다.
BrassApparatus

답변:


9

어떤 이유로 $USER설정되지 않은 경우 id명령을 사용 하여 실제 사용자의 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

문제를 단순화하고 변수 sitename을 받고 있으므로 username 변수를 읽지 않는 이유는 무엇입니까?

이를 통해 스크립트 실행이 스크립트 실행 방식으로 제공되는 환경 변수에 의존하지 않는지 확인하십시오.


0

내가 생각하는 작은 잘못이 있습니다. sudo는 명령을 실행하기위한 새 쉘을 열고 sudo 후에 사용자는 root입니다. 따라서 다음과 같은 것을 사용해야합니다.

MYUSER = $ USER

sudo chown $ MYUSER : $ MYUSER

MYUSER는 시스템에 덮어 쓰지 않았으며 작동합니다.


1
변수는 명령이 실행되기 전에 평가되므로 제안 된 대안은 차이가 없습니다. (시도해보십시오 echo chown....)
roaima
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.