我编写了一个 bash 脚本来迭代 /etc/passwd 并将每个 UID 更改为由 name-UID 值的输入文件提供的新值。作为额外的警告,我在检查是否有正在运行的进程中写道:
# Mod user and group
usermod -u $uid $login
groupmod -g $uid $login
find /data -group $old_uid -exec chgrp -h $login {} \;
find /data -user $old_gid -exec chown -h $login {} \;
不幸的是,事实证明,大多数用户即使没有主动使用机器,也会有一些进程。当进程正在运行时执行上述代码会有多危险?
答案1
这是一个相当危险的操作。如果您必须这样做,请尽您所能确保这些用户没有任何运行。
- 告诉用户(尽可能多地警告)你在做什么以及何时做。
- 在开始工作之前,礼貌地要求他们终止所有正在运行的进程。
- 在您工作时暂时阻止所有用户登录
- 在开始之前强制终止所有用户进程和会话
这就是为什么......。为了便于讨论usermod
,仅groupmod
影响:
- 用户登录时为用户会话分配的 UID、GID 和组
chgrp
用于类似or操作的查找sudo
- 类似的东西使用的反向查找
ls -l
所有正在运行的进程都将具有与以往完全相同的 UID 和 GID。如果你在用户正在运行某些东西时更改用户,这真的很糟糕:
- 他们仍然打开的任何旧登录会话都将保留旧的 UID 和 GID。如果您回收 UID 和 GID,它们将有效地以其他用户身份登录。
- 他们运行的任何未附加到当前登录会话的进程都将实际上变得“流氓”。用户将不再能够登录并杀死他们,可能不再有任何用户可以除了
root
- 当您也更改文件所有权时,任何正在运行的进程在失去对其正在处理的数据的所有访问权限时可能会崩溃。