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
Cyrus、

1
$USER変数は対話型ログイン中に設定されます。ログインセッションから、またはcronを使用して、またはデーモンからスクリプトをどのように実行しますか?
myaut 2015

1
スクリプトでUSER変数が表示されているかどうかを確認します。スクリプトにと言う行を追加するとecho USER is $USER、何が出力されますか?
マークプロトニック2015

@MarkPlotnick明らかに、USER is root。私が行った編集で、root以外のユーザーがスクリプトを実行するようにファイルを変更する方法を説明できると思いますか?
BrassApparatus、2015

@myautターミナルから手動で実行します。
BrassApparatus、2015

回答:


8

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

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

場合はUSER、これが実行されたときに空または設定解除され、bashが設定されますUSERの出力に変数を/usr/bin/id -run


4

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

$ sudo ./myscript.sh

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

で使用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 -まだショーのルート-動作しません:ルート
サム-T

2

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

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


0

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

MYUSER = $ USER

sudo chown $ MYUSER:$ MYUSER

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


1
変数はコマンドが実行される前に評価されるため、提案された代替案は違いを生じません。(試してみてecho chown...ください。)
roaima
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.