web-dev-qa-db-ja.com

ディレクトリとファイルの所有権を修復するためのBashスクリプト

私のクライアントは、顧客のWebサイトのホームディレクトリの束にいくつかのフォルダを展開するように指示しました。これをBashスクリプトで実行しましたが、rootアカウントのアクセス許可を使用することになりました。

/ home/ser(隠しファイルやフォルダーではない)の下の各フォルダーを取得し、そのフォルダーのユーザーとグループの所有権を取得してから、chown -R {userを実行するBashスクリプトを作成するにはどうすればよいですか。 }。{group}/home/ser

サーバーはCentOSLinuxを実行しています。

6
ServerChecker

私はカイルブラントに上記の完全な信用を与えなければなりません。したがって、以下のこの回答が気に入った場合は、投稿の上の三角形をクリックして、ステータスを上げてください。

しかし、私は彼のルーティンを改善し、それをここに投稿して最終的な答えとしてマークすることが私の義務だと感じました。

カイルのルーチンに追加したのは、ホームディレクトリにのみ触れていること、つまりアスタリスクが含まれている行に触れていることだけです。次に、このホームディレクトリが実際にまだ存在していることを確認します。その後、chownステートメントを実行します。そして、カイルが言ったように、「echo」キーワードを削除すると、実際にタスクが実行されます。次に、問題が自宅のディレクトリの奥深くにある可能性がある場合に備えて、chownに「-R」を追加して再帰的に機能するようにしました。

#!/bin/bash

while IFS=':' read -r login pass uid gid uname homedir comment; do
    if [[ "$homedir" = **/home/** ]]; then
        if [ -d "$homedir" ]; then
            echo chown -R $uid:$gid "$homedir";
        fi
    fi
done < /etc/passwd
8
ServerChecker

私はあなたが求めている方法は一種の逆行だと思います。各フォルダーを取得してからユーザーを見つけるのではなく、ユーザーを取得してホームフォルダーを検索する必要があります。

#!/bin/bash
while IFS=':' read -r login pass uid gid uname homedir comment; do 
    echo chown $uid:$gid "$homedir"; 
done < /etc/passwd

もちろん、エコーを削除する必要があり、root権限でこれを実行する必要があります。また、自分でlsのforループではなく、whileループを常にお勧めします。 /etc/passwdを使用して何かを行うために、このループを保存できます。

8
Kyle Brandt
#!/bin/bash

for f in $( ls /home/ );
  do chown -R $f:yourgroup /home/$f
done

これにはサニティチェックがなく、テストなしで書いたので注意してください。

(ところで、「隠しファイルやフォルダーがない」という要件は、Unixの隠しファイルが、前に。が付いた通常のファイルであり、.usernameはchownの有効なユーザーではないという事実によって満たされます)。

5
Sven

これは役立つかもしれません

   #!/bin/bash
    for file in `ls -a | grep -v '^\.'`
    do
            if [[ -d $file ]]
            then
                    fowner=`ls -ld $file | nawk '{print $3}'`
                    fgroup=`ls -ld $file | nawk '{print $4}'`
                    chown -R $fowner:$fgroup $file
            fi
    done
3
user9517

getentを使用して、ユーザーIDが500以上の各ユーザーのユーザー名、グループ名、およびホームディレクトリを取得し、chown -Rを介して適用します。また、最近はuser:groupです。

for i in ls -l /home/ | awk '{print $3}'; do chown -R $ i/home/$ i; done
for i in ls -l /home/ | awk '{print $4}'; do chgrp -R $ i/home/$ i; done

1
Ma Diga