名前でディレクトリの所有者とグループを変更するには?

名前でディレクトリの所有者とグループを変更するには?

ドキュメント ルート ディレクトリに複数の WordPress (CMS) Web サイトがある Ubuntu 16.04 Nginx サーバー環境があります。

すべてのサイトディレクトリには、www-data繰り返し所有者とグループがあります。


私が受け取ったいくつかのセキュリティ勧告によれば、これはあるサイトのデータが別の隣接サイトを変更する可能性があるために問題になると言われています(たとえば、サイトの1つのCMSにインストールされた悪意のあるモジュール)。

解決策は、新しいサイトを追加した後(そして所有者とグループを変更する更新後にcronで)、常に実行するこのコマンドを変更することです。

chown -R www-data:www-data /var/www/html/*

www-data一部の条件付きコマンドは、これらの属性をサイトディレクトリの実際の名前に変更する以外の操作を実行します。

明確にすると、各サイトディレクトリの所有者はグループでなけれdomain.tldばならず、グループも同じでなければなりませんdomain.tld。私は常にサイトのdomain.tldに基づいてサイトディレクトリの名前を指定します。

そのような条件付きコマンドは何ですか?


注:Nginxユーザーとディレクトリの/var/www/html/両方www-data:www-data

Gマンアップデート:

まだテストしていませんが、${domain}変数の最初の引数に()を渡すことで$1問題ありません。

chown -R ${domain}:${domain} ${domain}/*

私はそれを維持しますが:

chown -R ${domain}:www-data ${domain}/*

もちろん、adduser ${domain} --disabled-password --disabled-loginそうでない場合はその前に必要です。

答え1

何か抜けたようですが、簡単に見えます。

$ cd /var/www/html
$ for dir in *
do
    chown -R "$dir:$dir" "$dir"
done

これらのコマンドの正確性が懸念される場合は、次の単語を挿入できます。echochownたとえば、以前は

$cd /var/www/html
$ は * のディレクトリを表します。
する
    エコchown -R "$dir:$dir" "$dir"
完璧

chown実際に実行せずに実行するコマンドを伝えます。このヒントは完全な回答に適用され、実際にはほとんどのシェルスクリプトソリューション(他の質問など)に適用されます。

一行にしたいなら、

$ cd /var/www/html  &&  for d in *; do chown -R "$d:$d" "$d"; done

cd複雑さを避けるためにもう一つの答え 抱擁。そうすれば

$ for dir in /var/www/html/*

その後、、などdirに設定されます。これはディレクトリを操作するのに適していますが、必要なユーザー名とグループ名を提供しません。別の答えは、やや複雑な(完全に信頼できない)プロセスを使用して、ディレクトリパスの最後のレベル(ディレクトリ名とユーザー名でもあります。例:)を残りのパスから分離します。幸いなことに、次のようにシェルで同等ですが、より良い作業を完全に実行できます。/var/www/html/domain1/var/www/html/domain2/var/www/html/domain3chownawkdomain1

$ for dir in /var/www/html/*
do
    owner="${dir##*/}"
    chown -R "$owner:$owner" "$dir"
done

${dir##*/}特別な形ですパラメータ拡張$dir最後の(スラッシュ)文字の値を取得し、/すべての項目(含む)を削除します。もちろん、カタログだけが残ります。名前はユーザー名なので、ownerに割り当てますchown。このコードは次のとおりです。POSIX互換 このサイトのいくつかの答えとは異なり、POSIX互換シェルで動作する必要があり、bashに依存しません。

やりたいならこれ一行に、

$ for d in /var/www/html/*; do o="${d##*/}"; chown -R "$o:$o" "$d"; done

もちろん、メインシェルの作業ディレクトリを変更しないことが心配な場合は、サブシェルで最初のコマンドを実行できます。

$ (cd /var/www/html  &&  for d in *; do chown -R "$d:$d" "$d"; done)

言うまでもなく(とにかく言います)、このコマンドを実行する前に、などの名前を持つdomain1ユーザーdomain2(およびグループ)を定義する必要があります。domain3新しいサイトを追加するスクリプトがある場合は、それを実行してくださいchownchown定義されたユーザー名ではなく名前で実行すると、エラーメッセージが表示されますinvalid user

関連情報