私が実行している小さな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"
実行時に空であるか設定されていない場合、USER
bashは変数USER
を/usr/bin/id -run
。
答え2
スクリプトを呼び出すとルートにsudo
設定されます$USER
。
$ sudo ./myscript.sh
試してみましたが、chown ${USER:=$(/usr/bin/id -run)}:$USER /var/www/$sitename
まだルートを返します。
who
withを使用すると、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はシステム固有のオーバーライドではなく、機能すると思うからです。