在 bash 脚本中使用 chown $USER:$USER

在 bash 脚本中使用 chown $USER:$USER

在我正在运行的一个小型 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。

我发现如果我使用whowithawk我能够获取使用 调用脚本的当前用户sudo

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

答案3

为了简化问题,既然您正在获取变量站点名称,为什么不读取用户名变量呢?

这样,您就可以确保脚本执行不依赖于脚本执行方式可用的环境变量。

答案4

我认为只有一个小错误。 sudo 打开一个新的 shell 来执行命令,在 sudo 之后用户就是 root。所以也许你应该使用这样的东西:

我的用户=$用户

须藤 chown $MYUSER:$MYUSER

因为我认为 MYUSER 不是系统特定的覆盖,并且可以工作。

相关内容