web-dev-qa-db-ja.com

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

私が実行している小さな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の問題ですか?

[〜#〜] edit [〜#〜]これが完全なスクリプトです。 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"
10
BrassApparatus

何らかの理由で$USERが設定されていない場合は、idコマンドを使用して実際のユーザーのIDを取得できます。したがって、$USER変数を初めて使用するときは、シェル拡張を使用してデフォルト値を指定できます。スクリプトのchown行を次のように変更します。

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

実行時にUSERが空または未設定の場合、bashはUSER変数を/usr/bin/id -runの出力に設定します

8
Tim Cutts

Sudoを使用してスクリプトを呼び出すと、_$USER_がルートに設定されます。

_$ Sudo ./myscript.sh
_

私はchown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitenameを試しましたが、それでもルートを返します。

whoawkとともに使用した場合、Sudoを使用してスクリプトを呼び出した現在のユーザーを取得できました。

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

問題を単純化するために、そして変数sitenameを取得しているので、なぜユーザー名変数を読み取らないのですか?

これにより、スクリプトの実行が、スクリプトの実行方法で利用できるようにされた環境変数に依存しないことを確認できます。

2
marcosjsramos

ほんの小さな欠点があると思います。 Sudoはコマンドを実行するための新しいシェルを開き、Sudoの後、ユーザーはrootになります。だから多分あなたはこのようなものを使うべきです:

MYUSER = $ USER

Sudo chown $ MYUSER:$ MYUSER

私がMYUSERは上書きされたsystemspezificではなく、うまくいくと思うので。

0
Andreas Bartels