在我正在运行的一个小型 bash 脚本中,我尝试 chown 创建的新目录。我已经添加:
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 给执行脚本的非 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
如果由于某种原因$USER
没有设置,可以使用该id
命令来获取真实用户的身份。因此,第一次使用该$USER
变量时,可以使用 shell 扩展来提供默认值。将chown
脚本中的行更改为:
sudo chown "${USER:=$(/usr/bin/id -run)}:$USER" "/var/www/$sitename"
如果USER
运行时为空或未设置,bash 会将变量设置USER
为 的输出/usr/bin/id -run
。
答案2
当我用它调用我的脚本时,sudo
它将设置$USER
为 root。
$ sudo ./myscript.sh
我尝试过chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename
,但它仍然会返回root。
我发现如果我使用who
withawk
我能够获取使用 调用脚本的当前用户sudo
。
currentuser=$(who | awk '{print $1}')}
chown -R $currentuser:$currentuser /var/www/$sitename`
答案3
为了简化问题,既然您正在获取变量站点名称,为什么不读取用户名变量呢?
这样,您就可以确保脚本执行不依赖于脚本执行方式可用的环境变量。
答案4
我认为只有一个小错误。 sudo 打开一个新的 shell 来执行命令,在 sudo 之后用户就是 root。所以也许你应该使用这样的东西:
我的用户=$用户
须藤 chown $MYUSER:$MYUSER
因为我认为 MYUSER 不是系统特定的覆盖,并且可以工作。