Как изменить UID&GID пользователя и что из этого выйдет

Как изменить UID&GID пользователя и что из этого выйдет

У меня есть файлы данных MySQL на флэш-накопителе, которые используются на двух хостах, где mysqlUID пользователей различаются. В результате MySQL не запускается, когда его файлы имеют 0700разрешения и неизвестный UID в качестве владельца.

Мне не удалось найти, как изменить umask MySQL (и на самом деле мне не нравится идея предоставления общего доступа к этим файлам всем), поэтому я хочу изменить UID пользователя mysqlна обоих хостах, чтобы файлы принадлежали одному и тому же пользователю.

Я собираюсь изменить UID и для chownвсех файлов, принадлежащих старому пользователю mysql, указать нового пользователя:

usermod --uid 900 --gid 900 mysql # assign the new uid
olduid=67   find / -user $olduid -group $olduid -print0 | xargs -0 chown "mysql:mysql"

Достаточно ли этого для работы приложения в общем случае? Может быть, у меня есть варианты получше?

решение1

Я провел небольшое исследование и заметил две вещи, которые следует учитывать при изменении 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

Затем мы 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" \) \)

И только теперь можно менять владельцев и группы для следующих найденных файлов:

cat "$chownlist" | xargs -0 sudo chown $user
cat "$chgrplist" | xargs -0 sudo chown :$group
sudo rm "$chownlist" "$chgrplist"

Наконец, проверяем, все ли прошло хорошо: находим файлы, принадлежащие неизвестным UID или GID:

sudo find / \( \( -path "/proc" -or -path "/sys" -or -path "/dev" \) -prune \) -or \( -nouser -or -nogroup -print \)

Надеюсь, это кому-то поможет.

решение2

Да, это почти все, что вам нужно сделать. Единственные файлы, которые нужно изменить, это файлы журналов и данных.

Однако вам, возможно, захочется использовать find | xargs вместо цикла.

Связанный контент