How to change user's UID&GID and what comes out of that
Solution 1:
I've made some research and noticed two things one should take into account when changing UIDs&GIDs:
- Numeric UID and GID do not always match: in my case
id -u mysql
=120 andid -g mysql
=127 - Not all files are owned by user 'mysql' and group 'mysql' simultaneously: these files should be searched for separately.
Therefore, we first change UID and GID:
user=mysql new_uid=600 old_uid=$(id -u $user)
group=mysql new_gid=600 old_gid=$(id -g $user)
sudo usermod -u $new_uid $user
sudo groupmod -g $new_gid $group
Then we find
for files owned by the late user and group separately: 'user=mysql' goes to one file, 'group=mysql' goes to another file. Also we exclude some directories from find
traversing tree:
chownlist=$(tempfile) chgrplist=$(tempfile) sudo find / \
\( \( -path "/proc" -or -path "/sys" -or -path "/dev" \) -prune \) -or \
\( \( -user $old_uid -fprint0 "$chownlist" \) , \
\( -group $old_gid -fprint0 "$chgrplist" \) \)
And only now it's okay to change owners and groups for these files found:
cat "$chownlist" | xargs -0 sudo chown $user
cat "$chgrplist" | xargs -0 sudo chown :$group
sudo rm "$chownlist" "$chgrplist"
Finally, we check if everything went okay: find files owned by unknown UIDs of GIDs:
sudo find / \( \( -path "/proc" -or -path "/sys" -or -path "/dev" \) -prune \) -or \( -nouser -or -nogroup -print \)
Hope this helps someone.
Solution 2:
Yeah, that's pretty much all you need to do. The only files which should need changing are the logs and data files.
You might want to use find | xargs rather than a loop though.