작은 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"
답변
어떤 이유로 $USER
설정되지 않은 경우 id
명령을 사용 하여 실제 사용자의 ID를 얻을 수 있습니다 . 따라서 $USER
변수를 처음 사용할 때 쉘 확장을 사용하여 기본값을 제공 할 수 있습니다. chown
스크립트 의 줄을 다음과 같이 변경하십시오 .
sudo chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename
이것이 USER
실행될 때 비어 있거나 설정되어 있지 않으면 bash는 USER
변수를/usr/bin/id -run
답변
스크립트를 호출하면 루트로 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`
답변
문제를 단순화하고 변수 sitename을 받고 있으므로 username 변수를 읽지 않는 이유는 무엇입니까?
이를 통해 스크립트 실행이 스크립트 실행 방식으로 제공되는 환경 변수에 의존하지 않는지 확인하십시오.
답변
내가 생각하는 작은 잘못이 있습니다. sudo는 명령을 실행하기위한 새 쉘을 열고 sudo 후에 사용자는 root입니다. 따라서 다음과 같은 것을 사용해야합니다.
MYUSER = $ USER
sudo chown $ MYUSER : $ MYUSER
MYUSER는 시스템에 덮어 쓰지 않았으며 작동합니다.