如何将文本追加到NixOS中的/ etc/...配置文件中?

问题描述:

[披露:我之前在NixOS频道问过这个问题,但30分钟后没有得到答案,这是一个繁忙的频道。如果我得到一个,我会在这里复制]如何将文本追加到NixOS中的/ etc/...配置文件中?

我想添加一些行到NixOS的配置文件(例如/etc/pam.d/sudo)。在pam.nix中可用的配置选项不包括我要添加的行(在本例中为account requisite pam_time.so),并且它也不包括extraConfig选项。

我知道我可以创建一个使用environement.etc.filename.text所以我说去新的配置文件,但sudo nixos-rebuild switch则抱怨说,它有两个来源为配置文件,该负责人之一,矿(mismatched duplicate entry /nix/… <-> /nix/…):

environment.etc."pam.d/sudo".text = ''blah''; 

在NixOS中是否有一种通用的方法来追加到/ etc/configuration文件(或者修补它)?

或者是修改系统.nix文件的唯一方法(例如修改pam.nix,我不愿意这么做,因为它会与未来的更新相冲突)?

+0

此网站是有关编程的问题。你的问题不是写程序。请为您的问题寻找合适的场所。并且请显示一些耐心等待您的***免费***帮助。 –

+1

@DaleWilson https:// *。com/q/41007258是一个关于NixOS配置(相关但不重复)的问题,它在本网站上,但你说得对,最好转移到SuperUser。至于耐心,我想你是指我以前在IRC频道上询问的,这是一个非常繁忙的频道,并且消息很快就会移动到日志中,所以我从经验中知道,在该频道上它是快速答案或者没有答案。这个问题很普遍,可以帮助其他人(我没有具体询问PAM),因此无论如何都值得在永久性网站上分享答案。 –

+0

不是超级用户。 [Unix/Linux SE](https://unix.stackexchange.com)是一个更合适的地方,并且有许多与NixOS相关的问题。 –

对于/etc/pam.d/sudo和其他文件在同一目录中的文件,一个简单的解决方案是使用security.pam.services.sudo.text,但我目前的最佳尝试需要硬编码该文件的原始内容。

security.pam.services.sudo.text = '' 
existing contents of /etc/pam.d/sudo … 
extra lines … 
''; 

希望其他的答案会拿出改变的配置文件(并保持其原始内容)的更通用的方式。

您可以使用mkOverride或快捷键mkDefault将行添加到默认值security.pam.services.sudo.text,以使您的值具有与默认值相同的优先级。您可以使用mkOrder或快捷方式mkBeforemkAfter来控制订单。所以要追加,你可以这样做:

security.pam.services.sudo.text = pkgs.lib.mkDefault(pkgs.lib.mkAfter "# hi"); 

当一个选项有多个值时,只保留具有最低优先级的值。如果仍有多个值,则会对它们进行排序和合并。 mkOverridemkOrder创建特殊值,modules.nix中的代码可以识别何时执行此操作。普通值具有默认优先级(100)和排序顺序(1000)。 pam.nix使用mkDefault作为它为text选项创建的值,这会使优先级为1000,因此普通值将替换它而不是合并。

NixOS manual section on Modularity解释了一点。

我不认为你可以通过environment.etc这样做,因为目标文件不必与属性名称匹配,并且pam.nix特别没有命名为environment.etc中的任何条目。它更像是按顺序处理的指令列表。请参阅etc.nixmake-etc.sh