내가 실행 중인 작은 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"
런타임에 비어 있거나 설정되지 않은 경우 USER
bash는 변수 USER
를 /usr/bin/id -run
.
답변2
스크립트를 호출하면 루트로 sudo
설정됩니다 $USER
.
$ sudo ./myscript.sh
시도해 보았지만 chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename
여전히 루트를 반환합니다.
who
with 을 사용하면 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는 시스템 특정 재정의가 아니며 작동할 것이라고 생각하기 때문입니다.