macOS与常见Unix系统之间的一些差异

2020-12-25 21:34:28

讨论macOS与常见Unix系统之间的一些差异,以帮助Unix用户更快地熟悉macOS。

macOS通过目录服务而不是/ etc / passwd和/ etc / group来管理用户和组。考虑一个本地网络,例如您办公室中的一个本地网络,网络中有很多计算机,每个计算机都有自己的文件,帐户等。目录服务将这些分布式资源组织到一个索引中,使它们看起来像一个目录层次结构。

例如,/ Hosts / PC1代表网络中的主机,/ Users / Smith代表网络中的用户。 1个

第一个参数设置我们要检索的数据源。点表示本地数据源。

使用-list选项,dscl可以打印资源的子项。 / Users的子项是所有用户。 / Groups的子项都是组。

如果要检查有关资源的信息而不是列出子项,则应使用-read。例如,我们可以像下面那样检查用户Smith的信息。

-read打印指定资源的键和值。我们还可以指定所需的键。

#获取Smithdscl的主组ID和默认Shell。 -read / Users / Smith PrimaryGroupID UserShell

要添加资源,我们使用dscl。 -创造。以下命令添加新的用户belson。

看起来还可以,但实际上不是。如果我们尝试使用sudo passwd belson设置belson的密码,则passwd会告诉我们该用户不存在。因为dscl只是将记录添加到数据源中,但不会检查完整性。它甚至没有为belson分配UID。自己将belson添加到数据源后,必须为belson分配一个UID和一个主要组。

sudo dscl。 -创建/ Users / belson UniqueID 511#UID 511例如udo dscl。 -create / Users / belson PrimaryGroupID 20#人员组

现在,belson是Unix用户,您可以使用passwd为其设置密码。但是,您仍然无法以belson身份登录,因为我们没有为他分配外壳。

好了,我们现在可以以belson身份登录,但他没有主目录。我们必须创建目录并使用dscl指定它。

听起来地狱对吗?但这还没有结束。运行dscl。 -读取/ Groups / staff,您将发现GroupMembers和GroupMembership属性都没有有关belson的任何信息。我们已将他的主要小组指定为工作人员。但是如上所述,dscl不会检查完整性。双向关系必须手动维护。这是真正的地狱。

为了解决用户-组关系问题,我们可以使用dseditgroup。以下命令将belson添加到人员组,并负责完整性。 2

我们应该在这里做一个总结。要在小组人员中创建用户belson,我们需要:

sudo dscl。 -创建/ Users / belsonsudo dscl。 -创建/ Users / belson UniqueID 511#UID 511例如udo dscl。 -create / Users / belson PrimaryGroupID 20#人员groupsudo dscl。 -创建/ Users / belson UserShell / bin / bashsudo dscl。 -create /用户/ belson NFSHomeDirectory /用户/ belsonsudo dseditgroup -o编辑-a belson -t用户staffsudo mkdir / User / belsonsudo chmod -R belson:staff / User / belson

对于系统管理员来说,仅仅为了创建一个新用户而键入那么多命令是很痛苦的。您必须非常错过Debian中的adduser和addgroup。

幸运的是,从Mac OS X 10.10开始,提供了sysadminctl命令。这是dscl的高级界面。在终端中输入sysadminctl以查看其用法3。

用法:sysadminctl -deleteUser<用户名> [-安全|| -keepHome](交互式|| -adminUser<管理员用户名> -adminPassword<管理员密码>)-newPassword<新密码> -oldPassword<旧密码> [-passwordHint<密码提示>] -resetPasswordFor<本地用户名> -newPassword<新密码> [-passwordHint<密码提示>](交互式)|| -adminUser<管理员用户名> -adminPassword<管理员密码>)-addUser<用户名> [-fullName<全名>] [-UID<用户ID>] [-shell< shell的路径>] [-password<用户密码>] [-hint<用户提示>] [-home< ;完整的家庭路径>] [-admin] [-图片<用户图像的完整路径>](交互式)|| --adminUser<管理员用户名> -adminPassword<管理员密码>)-secureTokenStatus<用户名; -secureTokenOn<用户名> -密码<密码> (交互式|| -adminUser<管理员用户名> -adminPassword<管理员密码>)-secureTokenOff<用户名> -密码<密码> (交互式|| -adminUser<管理员用户名> -adminPassword<管理员密码>)-guestAccount< on ||关闭||状态> -afpGuestAccess< on ||关闭||状态> -smbGuestAccess< on ||关闭||状态> -automaticTime< on ||关闭||状态> -文件系统状态-screenLock<立即||关闭> -password< password> Pass'-'而不是上面命令请求提示中的密码。' -adminPassword'主要用于脚本操作。使用'-'或' interactive'以交互方式获取身份验证字符串。出于安全原因,这是首选

使用dscl检查目录服务,我们可以发现我们所做的一切都已删除。

如果检查根目录,将会看到一些传统的Unix东西,例如/ usr,/ var和/ etc。您还可能会找到Mac指定的内容,例如/ Library / Applications和/ cores。

包含tmp,var等目录。 / tmp,/ var,/ etc是指向这些子目录的符号链接

包含一个子目录“库”,其中包含系统和系统应用程序的支持文件。

包含网络挂载的Application,Library和Users目录,以及包含由自动挂载守护程序挂载的目录的Servers目录。

包含系统上用户的主目录。根用户的主目录是/ var / root(实际上是/ private / var / root)。

您可能会对/ Library和/ usr / lib之间的区别感到困惑。我们应该将库放入哪个目录?

/ Library适用于macOS特定的软件,例如您从App Store下载的事物数据,以及macOS随附的BSD程序,例如预安装的Perl和预安装的Python模块。

在现代Linux中,系统启动了内核启动的第一个程序。在macOS中启动了5。

launchd管理两种类型的服务,LaunchDaemon和LaunchAgent。引导系统后,将启动LaunchDaemon。用户登录后,将启动LaunchAgent。

如果在引导系统之后需要启动程序,则需要将.plist文件放入/ Library / LaunchDaemons或/ System / LaunchDaemons中。

如果需要在用户登录后启动程序,则需要将.plist文件放入用户的/ Library / LaunchAgents或/ System / LaunchAgents或〜/ Library / LaunchAgents中。

#启用sshdsudo launchctl加载-w /System/Library/LaunchDaemons/ssh.plist#禁用sshdsudo launchctl卸载-w /System/Library/LaunchDaemons/ssh.plist

您购买了Mac进行开发。人们告诉您,您需要执行以下两项操作:

您完成了这些操作,打开了终端,发现一切都很熟悉。您决定用C编写经典的Hello World来庆祝。

如果您使用的是第三方编译器,则该编译器可能会告诉您找不到stdio.h。

没有这样的基本文件?您想要检查/ usr / include,您会发现/ usr / include甚至都不存在。

原因是头文件被放入Xcode之类的新Xcode包中,例如Xcode10。您可以运行xcrun --show-sdk-path来打印路径6。

通常,安装到系统的第一个软件包是软件包管理器。但是,macOS没有默认的软件包管理器。如果在线搜索,您会发现Homebrew是macOS最受欢迎的软件包管理器。

自制软件对很多人都有益,但对于希望事情像普通的Unix系统那样的人却不利。

自制软件不能以root用户身份运行。如果要安装python,请运行brew install python而不是sudo brew install python。 Homebrew将软件包安装到/ usr / local。为了实现无须使用sudo的目标,Homebrew将/ usr / local下所有文件和子目录的所有者更改为安装Homebrew的用户。

这带来了安全问题。考虑到恶意软件伪造gcc来感染您编译的所有代码,而没有Homebrew所做的事情,它必须以root用户身份运行才能实现其目标,但是现在,即使它以普通用户身份运行,它也可以写入/ usr / local / bin / gcc。

除了安全问题外,如果您与其他人共享计算机或将其用作服务器,Homebrew还会带来另一个问题。两名管理员都希望使用Homebrew来安装软件包,但是/ usr / local / bin只能属于其中一个。因此,另一个管理员将失败。如果他或她尝试通过sudo使用Homebrew,则他或她也将失败。因为Homebrew将检查它是否以root用户身份运行。如果是这样,除非Homebrew本身属于root,否则Homebrew将拒绝工作。

好的,在共享系统上使用Homebrew的方法似乎是通过root安装Homebrew并将其与sudo一起使用。但是,我们是否敢将根特权授予一个不求我们执行的程序?那么,我们该怎么办?我在这里引用Homebrew的文档:

如果您需要在多用户环境中运行Homebrew,请考虑创建一个单独的用户帐户,尤其是要使用Homebrew。

这意味着每次我们要使用Homebrew时,都必须先切换帐户。

太麻烦了,但是如果您确实喜欢Homebrew并且想要以Unix方式使用它,就是这样。

如果您不是Homebrew的粉丝,那么还有其他软件包管理器。 MacPorts是其中之一,Unix黑客可能会更欢迎它。它需要sudo来安装软件包并将它们安装到/ opt。因此,您可以将不在软件包管理器中的软件包安装到/ usr / local。

macOS是一个很棒的系统。它基于Unix,但如果仅将其用作另一个Unix,则将是巨大的浪费。享受其精彩的GUI系统。