ユーザーとそのファイルのUIDとGIDを変更する

reuid.png - image uploaded to Picamatic
ここで、ユーザーのUIDとGIDを変更し、すべてのファイルの所有者を正しく変更するというタスクに直面しました。
事実、私は2台のコンピューターを交互に使用しており、mysqlファイルはUSBフラッシュドライブにあります。 両方のコンピューターのmysqlユーザーIDが異なり、マッスルがそのファイルにアクセスできないことが判明しました。 0666権限の割り当ては退屈で、この機会にユーザーuidを正しく変更する方法を学ぶことにしました:)

すべてがシンプルに思えますが、考慮すべき2つのニュアンスがあります。
  1. UIDとGIDは、ユーザーとグループで常に同じではありません
  2. すべてのファイルがmysqlユーザーとmysqlグループに同時に属するわけではありません:chownのファイルは個別に検索する必要があります
この記事は、まだそのようなことをしていない人や、高度な方法でfindコマンドを使用する方法を学び、xargsとは何かを知りたい人のために書かれています。



ユーザーIDとグループを変更する

最初のステップは最も簡単で、インターネット上で多くのことが書かれています。 最初の2行では、変数に有用なデータを保存します:ユーザーとグループの名前、新しいID、古いID。 これは、将来ファイルを検索するときに役立ち、またスクリプトの再利用を簡素化します。 最初のニュアンスにより、すべてが個別に示されます。UIDとGIDは異なる場合があります。
さらに-標準Linuxコマンドによる識別子の些細な変更:
user = mysql new_uid = 600 old_uid = $ id -u $ user
グループ = mysql new_gid = 600 old_gid = $ id -g $ user
sudo usermod -u $ new_uid $ user
sudo groupmod -g $ new_gid $グループ


孤立したファイルを検索する

mysqlファイル(たとえば、 ls -lah /var/lib/mysql )があるフォルダーの1つを見ると、ファイルが疑わしいユーザー112と疑わしいグループ127に属していることがわかります。それらを採用するためにそのようなファイルを探します:)

最初に思い浮かぶのは、ユーザー$old_uid またはグループ$old_groupすべてのファイルを見つけ、見つかったすべてのファイルを(xargsを使用して) chown $user:$group引数として収集することです。 findはrootとして実行され、最も厳重に保護されたフォルダーにまで登り、必要なものすべてを見つけることができます。 xargsはパイプから行を収集し、それらを引数(chown)で指定されたコマンドに渡します。 引数の長すぎる行を避けるために、 xargsはコマンドを数回実行できることに注意してください。
たとえば、次のように:
sudo find / -user $ old_uid -or -group $ old_gid -print0 | xargs -0 sudo chown $ user$グループ

フラグfind -print0find -print0 xargs -0すぐに注意を払います。これは、ファイル名にスペースが含まれる可能性があるfind -print0です。 このようなファイルは、 chownによって2つの異なるファイルとして認識されます。 最初のフラグは、見つかったすべてのファイルを末尾(Cの行末文字)にゼロで表示し、2番目のフラグはxargsファイルを改行ではなく互いに分離する必要があることを伝えますが、これによりほとんどの場合でも正しい処理が保証されますトリッキーなファイル名:)

ただし、この方法では目的の結果が得られません。「mysql:root」が所有する一部のファイルは「mysql:mysql」に属します。 しかし、私たちはすべてを非常に正確に行うことに同意しました:)したがって、ユーザーとグループの検索は別々に行わなければなりません。

2つのfindコマンドを連続して実行できます。
sudo find / -user $ old_uid -print0 | xargs -0 sudo chown $ user
sudo find / -group $ old_gid -print0 | xargs -0 sudo chown$グループ

そして、それはすでに真実にはるかに近づいていますが、それから 'uはハードディスク全体で2回さらさらしなければなりません。

findに強制的に2つの操作を並行して実行させ、ディスクからの読み取り回数を正確に半分に減らす方法があります。 これを行うには、条件のグループ化を使用し、括弧でコマンドをfindます(エスケープすることを忘れずに:そうでない場合はシェルがそれらを取得します)。それらの間に「カンマ」演算子を送信します。
2つの個別のファイルを作成します。最初のファイルには-user=$old_uidファイルのリストがあり、2番目には-group=$old_gidのファイルのリストがあり、これらのファイルを個別に処理します。 検索条件は2つのブラケットに分割され、各ファイルに対して実行されます。条件が満たされると、 -fprint0コマンドは孤立ファイルへのパスを対応する一時ファイルに書き込みます。
chownlist = $ 一時 ファイル chgrplist = $ 一時 ファイル
sudo find / \
\ - user $ old_uid -fprint0 " $ chownlist " \ 、\ (- group $ old_gid -fprint0 " $ chgrplist " \

短い検索の後、すべてのファイルが見つかります。

検索の最後のポイント:フォーラムでは、 findリストからフォルダーを除外して、クロールされないようにする方法がよく聞かれます。 これは、 -path "folder"条件と-prune組み合わせを使用して行われ、 findが条件に該当するフォルダーにクロールするのを防ぎfind 。 フォルダー '/ proc'および '/ sys'を検索から除外します。
これを行うには、ブラケットに別のグループを条件に追加し、 -or演算子で既存のブラケットからそれらを分離します。 この演算子は最初の条件を満たし、2番目の条件を満たします-最初の条件が機能しなかった場合のみ。 したがって、 findは、リストから除外されたディレクトリ(検索しないディレクトリ)を除外するかどうかを確認し、除外しない場合はファイルのリストを作成します。
これは次のように行われます。
chownlist = $ 一時 ファイル chgrplist = $ 一時 ファイル
sudo find / \
\ \ (- path "/ proc" -or -path "/ sys" \ )- prune \ - or \ #フォルダ除外
\ \ - user $ old_uid -fprint0 " $ chownlist " \ 、\ (- group $ old_gid -fprint0 " $ chgrplist " \ \


バックアップディスクへのパスを作成することもできます(例外はありますか?)、マウントされたネットワークボールなど。

フィニッシュライン

それだけです、リストはコンパイルされます。 ファイルのリストごとにchownを実行します。 異なるユーザーとグループを考慮して、ファイルの所有者を完全に保存しようとしたことを思い出してください。
" $ chownlist " | xargs -0 sudo chown $ user
" $ chgrplist " | xargs -0 sudo chown$グループ
sudo rm " $ chownlist " " $ chgrplist " #忘れずにクリーンアップする


確認する

最後に、不明なUIDまたはGIDのファイルがどこかにあるかどうかを確認しましょう。 これがfind -nouserfind -nogroupfind -nouserための2つの便利な条件がありfind -nogroup 。 また、悪名高い「/ proc」と「/ sys」を検索から除外することで検索を絞り込むことも役立ちます。
sudo find / -nouser -or -nogroup -print

すべてが正しく行われた場合(およびシステムに孤立したファイルがなかった場合)-コマンドは何も出力しません。

完全なスクリプトコード


この記事がお役に立てば幸いです。 このコマンドの構文をよく理解することをお勧めします。それはあなたが思っているよりもはるかに強力です:)
最後に、ユーザーと彼のファイルのUIDとGIDを変更するための完全なスクリプトコードを示します。

#===設定
user = mysql new_uid = 600 old_uid = $ id -u $ user #名前、新旧のUID
group = mysql new_gid = 600 old_gid = $ id -g $ user #名前、新旧のGID
#=== UIDとGIDの変更
sudo usermod -u $ new_uid $ user
sudo groupmod -g $ new_gid $グループ
#===ファイル検索
chownlist = $ 一時 ファイル chgrplist = $ 一時 ファイル sudo find / \
\ \ (- path "/ proc" -or -path "/ sys" \ )- prune \ -または \
\ \ - user $ old_uid -fprint0 " $ chownlist " \ 、\ (- group $ old_gid -fprint0 " $ chgrplist " \ \
#=== chown and clean
" $ chownlist " | xargs -0 sudo chown $ user
" $ chgrplist " | xargs -0 sudo chown$グループ
sudo rm " $ chownlist " " $ chgrplist "

Source: https://habr.com/ru/post/J81715/


All Articles