在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吗?

编辑 这是完整的脚本。无论非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的组?getent group $USER
赛勒斯

1
$USER交互式登录期间设置变量。您如何运行脚本-从登录会话或使用cron或从守护程序运行?
myaut 2015年

1
检查脚本是否可以看到USER变量。如果在脚本中添加一行echo USER is $USER,则该行输出什么?
马克·普洛特尼克

@MarkPlotnick显然,USER is root。您认为通过我所做的编辑,您可以解释如何将文件授予任何非root用户执行脚本?
BrassApparatus

@myaut我从终端手动运行它。
BrassApparatus

Answers:


8

如果由于某种原因$USER未设置,则可以使用该id命令获取真实用户的身份。因此,第一次使用$USER变量时,可以使用Shell扩展来提供默认值。chown将脚本中的行更改为:

sudo chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename

如果USER为空或运行时未设置,bash会将USER变量设置为/usr/bin/id -run


4

当我用sudo它调用脚本时,它将设置$USER为root。

$ sudo ./myscript.sh

我尝试了,chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename但是它仍然会返回root。

我发现如果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

为了简化问题,并且由于您获取了变量站点名,为什么不读取用户名变量呢?

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


0

我认为只有一个小毛病。sudo打开一个用于执行命令的新外壳,并且在sudo之后用户是root。因此,也许您应该使用类似以下的内容:

MYUSER = $ USER

须藤chown $ MYUSER:$ MYUSER

因为我认为MYUSER没有被系统覆盖,因此可以正常工作。


1
该变量是在执行命令之前求值的,因此建议的替代方法没有任何区别。(尝试一下,echo chown...看看。)
roaima
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.