bashスクリプトでchown $USER:$USERを使用する

bashスクリプトでchown $USER:$USERを使用する

私が実行している小さな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

編集する 以下は完全なスクリプトです。スクリプトを実行している root 以外のユーザーにファイルをどのように 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"

実行時に空であるか設定されていない場合、USERbashは変数USER/usr/bin/id -run

答え2

スクリプトを呼び出すとルートにsudo設定されます$USER

$ sudo ./myscript.sh

試してみましたが、chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitenameまだルートを返します。

whowithを使用すると、awk呼び出しスクリプトを使用して現在のユーザーを取得できることがわかりましたsudo

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

答え3

問題を単純化するためにsitename変数を取得したので、ユーザー名変数を読んでみてはいかがでしょうか?

これにより、スクリプトの実行がスクリプトの実行方法で使用可能な環境変数に依存しないようにすることができます。

答え4

小さなエラーが一つあると思います。 sudoは、コマンドを実行するために新しいシェルを開きます。 sudoの後、ユーザーはrootです。したがって、次のようなものを使用する必要があります。

myuser=$user

Sudo chown $MYUSER:$MYUSER

MYUSERはシステム固有のオーバーライドではなく、機能すると思うからです。

関連情報