如何更改用户的 UID&GID 以及由此产生的结果

kol*_*pto 5 mysql linux user-management

我在拇指驱动器上有 MySQL 数据文件,这些文件在mysql用户 UID 不同的两台主机上使用。结果,当 MySQL 的文件具有0700权限且作为所有者的 UID 未知时,MySQL 无法启动。

我找不到如何更改 MySQL 的 umask(实际上我不喜欢将这些文件共享给所有人的想法),因此我想更改mysql两台主机上的用户UID,以便文件属于同一用户。

我要将 UID 和chown旧 mysql UID 拥有的所有文件更改为新用户:

usermod --uid 900 --gid 900 mysql # assign the new uid
olduid=67   find / -user $olduid -group $olduid -print0 | xargs -0 chown "mysql:mysql"
Run Code Online (Sandbox Code Playgroud)

这足以让应用程序在一般情况下工作吗?也许,我有更好的选择?

kol*_*pto 3

我做了一些研究,发现更改 UID 和 GID 时应该考虑两件事:

  1. 数字 UID 和 GID 并不总是匹配:在我的例子中id -u mysql=120 和id -g mysql=127
  2. 并非所有文件同时由用户“mysql”和组“mysql”拥有:应单独搜索这些文件。

因此,我们首先更改UID和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
Run Code Online (Sandbox Code Playgroud)

然后我们find分别为后期用户和组拥有的文件:“user=mysql”转到一个文件,“group=mysql”转到另一个文件。我们还从find遍历树中排除一些目录:

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" \) \)
Run Code Online (Sandbox Code Playgroud)

现在才可以更改找到的这些文件的所有者和组:

cat "$chownlist" | xargs -0 sudo chown $user
cat "$chgrplist" | xargs -0 sudo chown :$group
sudo rm "$chownlist" "$chgrplist"
Run Code Online (Sandbox Code Playgroud)

最后,我们检查一切是否正常:查找由未知 UID 或 GID 拥有的文件:

sudo find / \( \( -path "/proc" -or -path "/sys" -or -path "/dev" \) -prune \) -or \( -nouser -or -nogroup -print \)
Run Code Online (Sandbox Code Playgroud)

希望这对某人有帮助。