Unix 什么是著名的UID?

Unix 什么是著名的UID?,unix,Unix,根据useraddmanpage,低于1000的UID通常是为系统帐户保留的 我正在开发一个服务,它将作为自己的用户运行。我知道著名的端口可以在/etc/services中找到 有没有一个地方可以让我找出哪些著名的UID?我想避免与其他人的UID碰撞 我不确定是否存在这样的列表。通过/etc/passwd文件、/etc/shadow文件和NIS全局用户列表来注意UID的使用情况如何,注意正在使用哪些UID?那就用一个不是的吧 遍历密码数据库(通常是/etc/passwd,但不一定;例如,系统可能

根据
useradd
manpage,低于1000的UID通常是为系统帐户保留的

我正在开发一个服务,它将作为自己的用户运行。我知道著名的端口可以在
/etc/services
中找到


有没有一个地方可以让我找出哪些著名的UID?我想避免与其他人的UID碰撞

我不确定是否存在这样的列表。通过/etc/passwd文件、/etc/shadow文件和NIS全局用户列表来注意UID的使用情况如何,注意正在使用哪些UID?那就用一个不是的吧

遍历密码数据库(通常是
/etc/passwd
,但不一定;例如,系统可能在NIS域中)。系统已知的任何UID都应在此处表示

为了演示,下面的shell片段和C代码都应该打印系统上所有已知的UID

$ getent passwd | cut -d: -f3 $getent passwd |切割-d:-f3
#包括
#包括
int main(){
结构passwd*pw;
而((pw=getpwent())
printf(“%d\n”,pw->pw\u uid);
}
uid0始终是root,通常uid65534是nobody,但您不应该指望它,也不应该指望其他任何东西。UID的使用情况因操作系统、发行版甚至系统而异——例如,Gentoo上的许多系统服务在安装UID时都会进行分配。目前没有使用的UID中央数据库

另外,
/etc/login.defs
定义了什么是“系统UID”。在我的桌面上,它被配置为UID 100-999被视为系统帐户,UID 1000-60000被视为用户帐户,但这很容易更改


如果您正在编写服务,我建议将软件包安装脚本化,以便根据需要分配UID,并且您的软件可以配置为使用任何UID/用户名。

在Linux中,这是在
/etc/login.defs
中配置的。有时,当我安装一个基于Debian的系统时,为了与其他Red Hat-y机器保持一致,我将“uid start”选项(我忘记了它的名称,我现在不在Linux上)从1000更改为500


man login.defs
应该会提供您想要的所有信息。

我知道这是一篇老文章,但由于我在2017年来到这里,仍然试图回答一个类似的问题,我认为这些额外的信息与同一职位的其他人相关

“众所周知的UID”的概念可以追溯到unix的早期,当时还没有大量的发行版和unix变体。“众所周知的”uid被认为是系统用户的uid,如adm、daemon、lp、sync、operator、news、mail等,是所有不同系统的标准uid,以避免uid冲突。这些用户仍然存在于类似unix的现代操作系统中

在整个组织中标准化uid是避免这些问题的关键。正如上面的评论中所指出的,现在您选择的任何uid都可能在“某处”使用,因此系统管理员的最佳目标是确保uid在其维护的所有系统中都是标准的,然后为应用程序分配新的uid就变得简单了

为此,多年来,我发现下面链接的帖子非常宝贵,遗憾的是,关于这个话题的类似帖子并不多,而且很难找到

如果您在“uid”标签下搜索该博客,还有其他相关帖子,包括一个脚本,用于在Linux下跨多个主机自动标准化uid

这也是一种宝贵的资源


简单的回答是,你使用哪种uid并不重要,只要它们在你的组织中是唯一的和标准的,以避免冲突。

这个问题可能更适合你。我想一开始可能是这样,但挑选他或她安装的程序的uid不是系统管理员的工作。这是开发人员(或软件包维护人员)的工作。实际上,如果软件包开发人员为他们的软件指定了特定的UID或GID(不需要root权限),那么它就被破坏了。对于您选择的任何值,某个地方的某个人将使用您选择的UID(或GID)进行某些操作,并且不愿意更改它以适应您的软件(我不责怪他们)。此问题似乎与中定义的堆栈溢出无关。它可能更适合于Stack Exchange站点。嗯,这些是我的系统中使用的UID,但不是所有可能存在的UID。例如,我没有安装tomcat,但它使用UID 91。您可以编辑此内容以提及您对上述Bane答案的评论,或者将其记录为新答案吗?这似乎是我问题的真正答案——系统UID在unix/linux发行版中并不常见,因此问题无法解决。我愿意接受这个答案。
#include <pwd.h>
#include <stdio.h>
int main() {
    struct passwd *pw;
    while ((pw = getpwent()))
        printf("%d\n", pw->pw_uid);
}